diff --git a/src/pgtkselect.c b/src/pgtkselect.c index 425da3b8fd4..49569046caa 100644 --- a/src/pgtkselect.c +++ b/src/pgtkselect.c @@ -981,15 +981,22 @@ static void pgtk_display_selection_waiting_message (struct atimer *timer) { Lisp_Object val; + struct atimer **atimerp = timer->client_data; val = build_string ("Waiting for reply from selection owner..."); message3_nolog (val); + *atimerp = NULL; } static void -pgtk_cancel_atimer (void *atimer) +pgtk_cancel_atimer (void *atimerp) { - cancel_atimer (atimer); + struct atimer **atimer = atimerp; + if (*atimer) + { + cancel_atimer (*atimer); + *atimer = NULL; + } } @@ -1044,8 +1051,8 @@ pgtk_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_typ message_interval = make_timespec (1, 0); delayed_message = start_atimer (ATIMER_RELATIVE, message_interval, pgtk_display_selection_waiting_message, - NULL); - record_unwind_protect_ptr (pgtk_cancel_atimer, delayed_message); + &delayed_message); + record_unwind_protect_ptr (pgtk_cancel_atimer, &delayed_message); /* This allows quits. Also, don't wait forever. */ intmax_t timeout = max (0, pgtk_selection_timeout); diff --git a/src/xselect.c b/src/xselect.c index 93057c2d6c5..4c7a95fb945 100644 --- a/src/xselect.c +++ b/src/xselect.c @@ -1624,15 +1624,22 @@ static void x_display_selection_waiting_message (struct atimer *timer) { Lisp_Object val; + struct atimer **atimerp = timer->client_data; val = build_string ("Waiting for reply from selection owner..."); message3_nolog (val); + *atimerp = NULL; } static void -x_cancel_atimer (void *atimer) +x_cancel_atimer (void *atimerp) { - cancel_atimer (atimer); + struct atimer **atimer = atimerp; + if (*atimer) + { + cancel_atimer (*atimer); + *atimer = NULL; + } } @@ -1701,8 +1708,8 @@ x_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_type, message_interval = make_timespec (1, 0); delayed_message = start_atimer (ATIMER_RELATIVE, message_interval, x_display_selection_waiting_message, - NULL); - record_unwind_protect_ptr (x_cancel_atimer, delayed_message); + &delayed_message); + record_unwind_protect_ptr (x_cancel_atimer, &delayed_message); /* This allows quits. Also, don't wait forever. */ intmax_t timeout = max (0, x_selection_timeout);