From 2ef85e73295d47c6bd9ce6032ab720d4de2c6e7e Mon Sep 17 00:00:00 2001 From: Sebastian Ramacher Date: Wed, 11 May 2022 17:17:20 +0200 Subject: [PATCH] Also delay the execution of synctex_view (fixes #288) Send the dbus response first, and then start parsing and rendering of the synctex forward search. --- zathura/dbus-interface.c | 43 +++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/zathura/dbus-interface.c b/zathura/dbus-interface.c index 0c718b0..79a3457 100644 --- a/zathura/dbus-interface.c +++ b/zathura/dbus-interface.c @@ -398,19 +398,48 @@ handle_highlight_rects(zathura_t* zathura, GVariant* parameters, g_dbus_method_invocation_return_value(invocation, result); } +typedef struct { + zathura_t* zathura; + gchar* input_file; + unsigned int line; + unsigned int column; +} view_data_t; + +static gboolean +synctex_view_impl(gpointer ptr) +{ + view_data_t* data = ptr; + + synctex_view(data->zathura, data->input_file, data->line, data->column); + + g_free(data->input_file); + g_free(data); + return false; +} + static void -handle_synctex_view(zathura_t* zathura, GVariant* parameters, - GDBusMethodInvocation* invocation) +synctex_view_idle(zathura_t* zathura, gchar* input_file, unsigned int line, unsigned int column) +{ + view_data_t* data = g_try_malloc0(sizeof(view_data_t)); + data->zathura = zathura; + data->input_file = input_file; + data->line = line; + data->column = column; + + gdk_threads_add_idle(synctex_view_impl, data); +} + +static void +handle_synctex_view(zathura_t* zathura, GVariant* parameters, GDBusMethodInvocation* invocation) { gchar* input_file = NULL; - guint line = 0; - guint column = 0; + guint line = 0; + guint column = 0; g_variant_get(parameters, "(suu)", &input_file, &line, &column); - const bool ret = synctex_view(zathura, input_file, line, column); - g_free(input_file); + synctex_view_idle(zathura, input_file, line, column); - GVariant* result = g_variant_new("(b)", ret); + GVariant* result = g_variant_new("(b)", true); g_dbus_method_invocation_return_value(invocation, result); }