1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-29 07:58:28 +00:00

Move selection delayed message to a better location

* lisp/term/x-win.el (gui-backend-get-selection): Remove
`with-delayed-message' here.
* src/xselect.c (x_display_selection_waiting_message)
(x_cancel_atimer): New functions.
(x_get_foreign_selection): Add an atimer that displays the
message after a while.
This commit is contained in:
Po Lu 2022-06-21 09:35:07 +08:00
parent 256fac4886
commit 32a6d52d43
2 changed files with 37 additions and 9 deletions

View File

@ -1366,9 +1366,8 @@ This returns an error if any Emacs frames are X frames."
(cl-defmethod gui-backend-get-selection (selection-symbol target-type
&context (window-system x)
&optional time-stamp terminal)
(with-delayed-message (1 "Waiting for selection")
(x-get-selection-internal selection-symbol target-type
time-stamp terminal)))
(x-get-selection-internal selection-symbol target-type
time-stamp terminal))
;; Initiate drag and drop
(add-hook 'after-make-frame-functions 'x-dnd-init-frame)

View File

@ -36,6 +36,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#include "termhooks.h"
#include "keyboard.h"
#include "pdumper.h"
#include "atimer.h"
#include <X11/Xproto.h>
@ -1198,6 +1199,20 @@ x_handle_property_notify (const XPropertyEvent *event)
}
}
static void
x_display_selection_waiting_message (struct atimer *timer)
{
Lisp_Object val;
val = build_string ("Waiting for reply from selection owner...");
message3_nolog (val);
}
static void
x_cancel_atimer (void *atimer)
{
cancel_atimer (atimer);
}
/* Variables for communication with x_handle_selection_notify. */
@ -1223,9 +1238,14 @@ x_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_type,
Atom type_atom = (CONSP (target_type)
? symbol_to_x_atom (dpyinfo, XCAR (target_type))
: symbol_to_x_atom (dpyinfo, target_type));
struct atimer *delayed_message;
struct timespec message_interval;
specpdl_ref count;
count = SPECPDL_INDEX ();
if (!FRAME_LIVE_P (f))
return Qnil;
return unbind_to (count, Qnil);
if (! NILP (time_stamp))
CONS_TO_INTEGER (time_stamp, Time, requestor_time);
@ -1257,6 +1277,12 @@ x_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_type,
unblock_input ();
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);
/* This allows quits. Also, don't wait forever. */
intmax_t timeout = max (0, x_selection_timeout);
intmax_t secs = timeout / 1000;
@ -1288,13 +1314,16 @@ x_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_type,
if (NILP (XCAR (reading_selection_reply)))
error ("Timed out waiting for reply from selection owner");
if (EQ (XCAR (reading_selection_reply), Qlambda))
return Qnil;
return unbind_to (count, Qnil);
/* Otherwise, the selection is waiting for us on the requested property. */
return
x_get_window_property_as_lisp_data (dpyinfo, requestor_window,
target_property, target_type,
selection_atom, false);
return unbind_to (count,
x_get_window_property_as_lisp_data (dpyinfo,
requestor_window,
target_property,
target_type,
selection_atom,
false));
}
/* Subroutines of x_get_window_property_as_lisp_data */