Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[linux] pass the plugin instance around as user data #256

Merged
merged 1 commit into from
Jan 3, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
97 changes: 50 additions & 47 deletions linux/window_manager_plugin.cc
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@
(G_TYPE_CHECK_INSTANCE_CAST((obj), window_manager_plugin_get_type(), \
WindowManagerPlugin))

WindowManagerPlugin* plugin_instance;

struct _WindowManagerPlugin {
GObject parent_instance;
FlPluginRegistrar* registrar;
Expand Down Expand Up @@ -858,84 +856,92 @@ static void method_call_cb(FlMethodChannel* channel,
window_manager_plugin_handle_method_call(plugin, method_call);
}

void _emit_event(const char* event_name) {
void _emit_event(WindowManagerPlugin* plugin, const char* event_name) {
g_autoptr(FlValue) result_data = fl_value_new_map();
fl_value_set_string_take(result_data, "eventName",
fl_value_new_string(event_name));
fl_method_channel_invoke_method(plugin_instance->channel, "onEvent",
result_data, nullptr, nullptr, nullptr);
fl_method_channel_invoke_method(plugin->channel, "onEvent", result_data,
nullptr, nullptr, nullptr);
}

gboolean on_window_close(GtkWidget* widget, GdkEvent* event, gpointer data) {
_emit_event("close");
return plugin_instance->_is_prevent_close;
WindowManagerPlugin* plugin = WINDOW_MANAGER_PLUGIN(data);
_emit_event(plugin, "close");
return plugin->_is_prevent_close;
}

gboolean on_window_focus(GtkWidget* widget, GdkEvent* event, gpointer data) {
_emit_event("focus");
WindowManagerPlugin* plugin = WINDOW_MANAGER_PLUGIN(data);
_emit_event(plugin, "focus");
return false;
}

gboolean on_window_blur(GtkWidget* widget, GdkEvent* event, gpointer data) {
_emit_event("blur");
WindowManagerPlugin* plugin = WINDOW_MANAGER_PLUGIN(data);
_emit_event(plugin, "blur");
return false;
}

gboolean on_window_show(GtkWidget* widget, GdkEvent* event, gpointer data) {
_emit_event("show");
WindowManagerPlugin* plugin = WINDOW_MANAGER_PLUGIN(data);
_emit_event(plugin, "show");
return false;
}

gboolean on_window_hide(GtkWidget* widget, GdkEvent* event, gpointer data) {
_emit_event("hide");
WindowManagerPlugin* plugin = WINDOW_MANAGER_PLUGIN(data);
_emit_event(plugin, "hide");
return false;
}

gboolean on_window_resize(GtkWidget* widget, GdkEvent* event, gpointer data) {
_emit_event("resize");
gboolean on_window_resize(GtkWidget* widget, gpointer data) {
WindowManagerPlugin* plugin = WINDOW_MANAGER_PLUGIN(data);
_emit_event(plugin, "resize");
return false;
}

gboolean on_window_move(GtkWidget* widget, GdkEvent* event, gpointer data) {
_emit_event("move");
WindowManagerPlugin* plugin = WINDOW_MANAGER_PLUGIN(data);
_emit_event(plugin, "move");
return false;
}

gboolean on_window_state_change(GtkWidget* widget,
GdkEventWindowState* event,
gpointer data) {
WindowManagerPlugin* plugin = WINDOW_MANAGER_PLUGIN(data);
if (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) {
if (!plugin_instance->_is_maximized) {
plugin_instance->_is_maximized = true;
_emit_event("maximize");
if (!plugin->_is_maximized) {
plugin->_is_maximized = true;
_emit_event(plugin, "maximize");
}
}
if (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) {
if (!plugin_instance->_is_minimized) {
plugin_instance->_is_minimized = true;
_emit_event("minimize");
if (!plugin->_is_minimized) {
plugin->_is_minimized = true;
_emit_event(plugin, "minimize");
}
}
if (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) {
if (!plugin_instance->_is_fullscreen) {
plugin_instance->_is_fullscreen = true;
_emit_event("enter-full-screen");
if (!plugin->_is_fullscreen) {
plugin->_is_fullscreen = true;
_emit_event(plugin, "enter-full-screen");
}
}
if (plugin_instance->_is_maximized &&
if (plugin->_is_maximized &&
!(event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED)) {
plugin_instance->_is_maximized = false;
_emit_event("unmaximize");
plugin->_is_maximized = false;
_emit_event(plugin, "unmaximize");
}
if (plugin_instance->_is_minimized &&
if (plugin->_is_minimized &&
!(event->new_window_state & GDK_WINDOW_STATE_ICONIFIED)) {
plugin_instance->_is_minimized = false;
_emit_event("restore");
plugin->_is_minimized = false;
_emit_event(plugin, "restore");
}
if (plugin_instance->_is_fullscreen &&
if (plugin->_is_fullscreen &&
!(event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
plugin_instance->_is_fullscreen = false;
_emit_event("leave-full-screen");
plugin->_is_fullscreen = false;
_emit_event(plugin, "leave-full-screen");
}
return false;
}
Expand Down Expand Up @@ -976,15 +982,14 @@ gboolean on_mouse_press(GSignalInvocationHint* ihint,
guint n_param_values,
const GValue* param_values,
gpointer data) {
WindowManagerPlugin* plugin = WINDOW_MANAGER_PLUGIN(data);
GdkEventButton* event_button =
(GdkEventButton*)(g_value_get_boxed(param_values + 1));

// plugin_instance->_event_button = event_button;
// plugin->_event_button = event_button;

memset(&plugin_instance->_event_button, 0,
sizeof(plugin_instance->_event_button));
memcpy(&plugin_instance->_event_button, event_button,
sizeof(plugin_instance->_event_button));
memset(&plugin->_event_button, 0, sizeof(plugin->_event_button));
memcpy(&plugin->_event_button, event_button, sizeof(plugin->_event_button));
return TRUE;
}

Expand All @@ -1000,21 +1005,21 @@ void window_manager_plugin_register_with_registrar(
plugin->window_geometry.max_width = G_MAXINT;
plugin->window_geometry.max_height = G_MAXINT;
g_signal_connect(get_window(plugin), "delete_event",
G_CALLBACK(on_window_close), NULL);
G_CALLBACK(on_window_close), plugin);
g_signal_connect(get_window(plugin), "focus-in-event",
G_CALLBACK(on_window_focus), NULL);
G_CALLBACK(on_window_focus), plugin);
g_signal_connect(get_window(plugin), "focus-out-event",
G_CALLBACK(on_window_blur), NULL);
G_CALLBACK(on_window_blur), plugin);
g_signal_connect(get_window(plugin), "show", G_CALLBACK(on_window_show),
NULL);
plugin);
g_signal_connect(get_window(plugin), "hide", G_CALLBACK(on_window_hide),
NULL);
plugin);
g_signal_connect(get_window(plugin), "check-resize",
G_CALLBACK(on_window_resize), NULL);
G_CALLBACK(on_window_resize), plugin);
g_signal_connect(get_window(plugin), "configure-event",
G_CALLBACK(on_window_move), NULL);
G_CALLBACK(on_window_move), plugin);
g_signal_connect(get_window(plugin), "window-state-event",
G_CALLBACK(on_window_state_change), NULL);
G_CALLBACK(on_window_state_change), plugin);
g_signal_connect(get_window(plugin), "event-after",
G_CALLBACK(on_event_after), plugin);
find_event_box(plugin, GTK_WIDGET(fl_plugin_registrar_get_view(registrar)));
Expand All @@ -1030,7 +1035,5 @@ void window_manager_plugin_register_with_registrar(
fl_method_channel_set_method_call_handler(
plugin->channel, method_call_cb, g_object_ref(plugin), g_object_unref);

plugin_instance = plugin;

g_object_unref(plugin);
}