diff --git a/gtk/tr-prefs.c b/gtk/tr-prefs.c
index 070ae67da..ab927b867 100644
--- a/gtk/tr-prefs.c
+++ b/gtk/tr-prefs.c
@@ -1226,8 +1226,26 @@ struct test_port_data
{
GtkWidget * label;
gboolean * alive;
+ char text[128];
};
+/* this is invoked in the gtk main loop's thread */
+static gboolean
+testing_port_done_idle( gpointer gdata )
+{
+ struct test_port_data * data = gdata;
+
+ if( *data->alive )
+ {
+ gdk_threads_enter( );
+ gtk_label_set_markup( GTK_LABEL( data->label ), data->text );
+ gdk_threads_leave( );
+ }
+
+ return FALSE;
+}
+
+/* this is invoked in the libtransmission thread */
static void
testing_port_done( tr_session * session UNUSED,
long response_code UNUSED,
@@ -1240,11 +1258,10 @@ testing_port_done( tr_session * session UNUSED,
if( *data->alive )
{
const int isOpen = response_len && *(char*)response == '1';
- gdk_threads_enter( );
- gtk_label_set_markup( GTK_LABEL( data->label ), isOpen
- ? _( "Port is open" )
- : _( "Port is closed" ) );
- gdk_threads_leave( );
+ g_snprintf( data->text, sizeof( data->text ), isOpen
+ ? _( "Port is open" )
+ : _( "Port is closed" ) );
+ g_idle_add( testing_port_done_idle, data );
}
}
@@ -1255,14 +1272,11 @@ testing_port_begin( gpointer gdata )
if( *data->alive )
{
- GtkSpinButton * spin = g_object_get_data( G_OBJECT(
- data->label ),
- "tr-port-spin" );
- tr_session * session = g_object_get_data( G_OBJECT(
- data->label ),
- "session" );
- const int port = gtk_spin_button_get_value_as_int( spin );
char url[256];
+ GObject * o = G_OBJECT( data->label );
+ GtkSpinButton * spin = g_object_get_data( o, "tr-port-spin" );
+ tr_session * session = g_object_get_data( o, "session" );
+ const int port = gtk_spin_button_get_value_as_int( spin );
g_snprintf( url, sizeof( url ),
"http://portcheck.transmissionbt.com/%d",
port );