Flutter Linux Embedder
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 
11  GObject parent_instance;
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 
29 G_DEFINE_TYPE(FlWindowMonitor, fl_window_monitor, G_TYPE_OBJECT)
30 
31 static 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 
39 static 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 
47 static void is_active_notify_cb(FlWindowMonitor* self) {
48  flutter::IsolateScope scope(self->isolate);
49  self->on_is_active_notify();
50 }
51 
52 static void title_notify_cb(FlWindowMonitor* self) {
53  flutter::IsolateScope scope(self->isolate);
54  self->on_title_notify();
55 }
56 
57 static void moved_to_rect_cb(FlWindowMonitor* self,
58  GdkRectangle* flipped_rect,
59  GdkRectangle* final_rect,
60  gboolean flipped_x,
61  gboolean flipped_y) {
62  flutter::IsolateScope scope(self->isolate);
63  self->on_moved_to_rect(final_rect->x, final_rect->y, final_rect->width,
64  final_rect->height);
65 }
66 
67 static gboolean delete_event_cb(FlWindowMonitor* self, GdkEvent* event) {
68  flutter::IsolateScope scope(self->isolate);
69  self->on_close();
70 
71  // Stop default behaviour of destroying the window.
72  return TRUE;
73 }
74 
75 static void destroy_cb(FlWindowMonitor* self) {
76  flutter::IsolateScope scope(self->isolate);
77  self->on_destroy();
78 }
79 
80 static void fl_window_monitor_dispose(GObject* object) {
81  FlWindowMonitor* self = FL_WINDOW_MONITOR(object);
82 
83  g_clear_object(&self->window);
84 
85  G_OBJECT_CLASS(fl_window_monitor_parent_class)->dispose(object);
86 }
87 
88 static void fl_window_monitor_class_init(FlWindowMonitorClass* klass) {
89  G_OBJECT_CLASS(klass)->dispose = fl_window_monitor_dispose;
90 }
91 
92 static void fl_window_monitor_init(FlWindowMonitor* self) {}
93 
94 G_MODULE_EXPORT FlWindowMonitor* fl_window_monitor_new(
95  GtkWindow* window,
96  void (*on_configure)(void),
97  void (*on_state_changed)(void),
98  void (*on_is_active_notify)(void),
99  void (*on_title_notify)(void),
100  void (*on_moved_to_rect)(int, int, int, int),
101  void (*on_close)(void),
102  void (*on_destroy)(void)) {
103  FlWindowMonitor* self =
104  FL_WINDOW_MONITOR(g_object_new(fl_window_monitor_get_type(), nullptr));
105 
106  self->window = GTK_WINDOW(g_object_ref(window));
107  self->isolate = flutter::Isolate::Current();
108  self->on_configure = on_configure;
109  self->on_state_changed = on_state_changed;
110  self->on_is_active_notify = on_is_active_notify;
111  self->on_title_notify = on_title_notify;
112  self->on_moved_to_rect = on_moved_to_rect;
113  self->on_close = on_close;
114  self->on_destroy = on_destroy;
115  g_signal_connect_object(window, "configure-event",
116  G_CALLBACK(configure_event_cb), self,
117  G_CONNECT_SWAPPED);
118  g_signal_connect_object(window, "window-state-event",
119  G_CALLBACK(window_state_event_cb), self,
120  G_CONNECT_SWAPPED);
121  g_signal_connect_object(window, "notify::is-active",
122  G_CALLBACK(is_active_notify_cb), self,
123  G_CONNECT_SWAPPED);
124  g_signal_connect_object(window, "notify::title", G_CALLBACK(title_notify_cb),
125  self, G_CONNECT_SWAPPED);
126  g_signal_connect_object(gtk_widget_get_window(GTK_WIDGET(window)),
127  "moved-to-rect", G_CALLBACK(moved_to_rect_cb), self,
128  G_CONNECT_SWAPPED);
129  g_signal_connect_object(window, "delete-event", G_CALLBACK(delete_event_cb),
130  self, G_CONNECT_SWAPPED);
131  g_signal_connect_object(window, "destroy", G_CALLBACK(destroy_cb), self,
132  G_CONNECT_SWAPPED);
133 
134  return self;
135 }
static Isolate Current()
Definition: isolate_scope.cc:9
G_DEFINE_TYPE(FlBasicMessageChannelResponseHandle, fl_basic_message_channel_response_handle, G_TYPE_OBJECT) static void fl_basic_message_channel_response_handle_dispose(GObject *object)
return TRUE
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)
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)