mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-17 18:37:33 +00:00
NS selection bug fix and cleanup, see thread C-g crash in C-x C-f (OSX Lion).
Thread is on emacs-devel. * lisp/term/ns-win.el (ns-get-selection-internal) (ns-store-selection-internal): Declare. (ns-store-cut-buffer-internal, ns-get-cut-buffer-internal): Declare as obsolete. (ns-get-pasteboard, ns-paste-secondary): Use ns-get-selection-internal. (ns-set-pasteboard, ns-copy-including-secondary): Use ns-store-selection-internal. * src/nsselect.m (CUT_BUFFER_SUPPORT): Remove define. (symbol_to_nsstring): Fix indentation. (ns_symbol_to_pb): New function. (Fns_get_selection_internal): Renamed from Fns_get_cut_buffer_internal. (Fns_rotate_cut_buffers_internal): Removed. (Fns_store_selection_internal): Renamed from Fns_store_cut_buffer_internal. (ns_get_foreign_selection, Fx_own_selection_internal) (Fx_disown_selection_internal, Fx_selection_exists_p) (Fns_get_selection_internal, Fns_store_selection_internal): Use ns_symbol_to_pb and check if return value is nil. (syms_of_nsselect): Remove ifdef CUT_BUFFER_SUPPORT. Remove defsubr Sns_rotate_cut_buffers_internal. Sns_get_cut_buffer_internal renamed to Sns_get_selection_internal, Sns_store_cut_buffer_internal renamed to Sns_store_selection_internal. (ns_handle_selection_request): Move code to Fx_own_selection_internal and remove this function. (ns_handle_selection_clear): Remove, never used. (Fx_own_selection_internal): Move code from ns_handle_selection_request here.
This commit is contained in:
parent
e1b01a3a53
commit
c803b2b767
4 changed files with 103 additions and 120 deletions
|
|
@ -1,3 +1,14 @@
|
|||
2011-12-18 Jan Djärv <jan.h.d@swipnet.se>
|
||||
|
||||
* term/ns-win.el (ns-get-selection-internal)
|
||||
(ns-store-selection-internal): Declare.
|
||||
(ns-store-cut-buffer-internal, ns-get-cut-buffer-internal): Declare
|
||||
as obsolete.
|
||||
(ns-get-pasteboard, ns-paste-secondary): Use
|
||||
ns-get-selection-internal.
|
||||
(ns-set-pasteboard, ns-copy-including-secondary): Use
|
||||
ns-store-selection-internal.
|
||||
|
||||
2011-12-17 Chong Yidong <cyd@gnu.org>
|
||||
|
||||
* vc/vc.el (vc-next-action): Doc fix; remove CVS-isms.
|
||||
|
|
|
|||
|
|
@ -702,19 +702,24 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.")
|
|||
|
||||
;;;; Pasteboard support.
|
||||
|
||||
(declare-function ns-get-cut-buffer-internal "nsselect.m" (buffer))
|
||||
(declare-function ns-get-selection-internal "nsselect.m" (buffer))
|
||||
(declare-function ns-store-selection-internal "nsselect.m" (buffer string))
|
||||
|
||||
(define-obsolete-function-alias 'ns-get-cut-buffer-internal
|
||||
'ns-get-selection-internal "24.1")
|
||||
(define-obsolete-function-alias 'ns-store-cut-buffer-internal
|
||||
'ns-store-selection-internal "24.1")
|
||||
|
||||
|
||||
(defun ns-get-pasteboard ()
|
||||
"Returns the value of the pasteboard."
|
||||
(ns-get-cut-buffer-internal 'CLIPBOARD))
|
||||
|
||||
(declare-function ns-store-cut-buffer-internal "nsselect.m" (buffer string))
|
||||
(ns-get-selection-internal 'CLIPBOARD))
|
||||
|
||||
(defun ns-set-pasteboard (string)
|
||||
"Store STRING into the pasteboard of the Nextstep display server."
|
||||
;; Check the data type of STRING.
|
||||
(if (not (stringp string)) (error "Nonstring given to pasteboard"))
|
||||
(ns-store-cut-buffer-internal 'CLIPBOARD string))
|
||||
(ns-store-selection-internal 'CLIPBOARD string))
|
||||
|
||||
;; We keep track of the last text selected here, so we can check the
|
||||
;; current selection against it, and avoid passing back our own text
|
||||
|
|
@ -742,11 +747,11 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.")
|
|||
(defun ns-copy-including-secondary ()
|
||||
(interactive)
|
||||
(call-interactively 'kill-ring-save)
|
||||
(ns-store-cut-buffer-internal 'SECONDARY
|
||||
(buffer-substring (point) (mark t))))
|
||||
(ns-store-selection-internal 'SECONDARY
|
||||
(buffer-substring (point) (mark t))))
|
||||
(defun ns-paste-secondary ()
|
||||
(interactive)
|
||||
(insert (ns-get-cut-buffer-internal 'SECONDARY)))
|
||||
(insert (ns-get-selection-internal 'SECONDARY)))
|
||||
|
||||
|
||||
;;;; Scrollbar handling.
|
||||
|
|
|
|||
|
|
@ -1,3 +1,26 @@
|
|||
2011-12-18 Jan Djärv <jan.h.d@swipnet.se>
|
||||
|
||||
* nsselect.m (CUT_BUFFER_SUPPORT): Remove define.
|
||||
(symbol_to_nsstring): Fix indentation.
|
||||
(ns_symbol_to_pb): New function.
|
||||
(Fns_get_selection_internal): Renamed from Fns_get_cut_buffer_internal.
|
||||
(Fns_rotate_cut_buffers_internal): Removed.
|
||||
(Fns_store_selection_internal): Renamed from
|
||||
Fns_store_cut_buffer_internal.
|
||||
(ns_get_foreign_selection, Fx_own_selection_internal)
|
||||
(Fx_disown_selection_internal, Fx_selection_exists_p)
|
||||
(Fns_get_selection_internal, Fns_store_selection_internal): Use
|
||||
ns_symbol_to_pb and check if return value is nil.
|
||||
(syms_of_nsselect): Remove ifdef CUT_BUFFER_SUPPORT. Remove
|
||||
defsubr Sns_rotate_cut_buffers_internal. Sns_get_cut_buffer_internal
|
||||
renamed to Sns_get_selection_internal, Sns_store_cut_buffer_internal
|
||||
renamed to Sns_store_selection_internal.
|
||||
(ns_handle_selection_request): Move code to Fx_own_selection_internal
|
||||
and remove this function.
|
||||
(ns_handle_selection_clear): Remove, never used.
|
||||
(Fx_own_selection_internal): Move code from ns_handle_selection_request
|
||||
here.
|
||||
|
||||
2011-12-17 Ken Brown <kbrown@cornell.edu>
|
||||
|
||||
* fileio.c (check_writable) [CYGWIN]: Return non-zero if UID or
|
||||
|
|
|
|||
168
src/nsselect.m
168
src/nsselect.m
|
|
@ -35,8 +35,6 @@ Updated by Christian Limpach (chris@nice.ch)
|
|||
#include "termhooks.h"
|
||||
#include "keyboard.h"
|
||||
|
||||
#define CUT_BUFFER_SUPPORT
|
||||
|
||||
Lisp_Object QCLIPBOARD, QSECONDARY, QTEXT, QFILE_NAME;
|
||||
|
||||
static Lisp_Object Vselection_alist;
|
||||
|
|
@ -60,13 +58,18 @@ Updated by Christian Limpach (chris@nice.ch)
|
|||
symbol_to_nsstring (Lisp_Object sym)
|
||||
{
|
||||
CHECK_SYMBOL (sym);
|
||||
if (EQ (sym, QCLIPBOARD)) return NSGeneralPboard;
|
||||
if (EQ (sym, QCLIPBOARD)) return NSGeneralPboard;
|
||||
if (EQ (sym, QPRIMARY)) return NXPrimaryPboard;
|
||||
if (EQ (sym, QSECONDARY)) return NXSecondaryPboard;
|
||||
if (EQ (sym, QTEXT)) return NSStringPboardType;
|
||||
return [NSString stringWithUTF8String: SDATA (XSYMBOL (sym)->xname)];
|
||||
}
|
||||
|
||||
static NSPasteboard *
|
||||
ns_symbol_to_pb (Lisp_Object symbol)
|
||||
{
|
||||
return [NSPasteboard pasteboardWithName: symbol_to_nsstring (symbol)];
|
||||
}
|
||||
|
||||
static Lisp_Object
|
||||
ns_string_to_symbol (NSString *t)
|
||||
|
|
@ -230,70 +233,11 @@ Updated by Christian Limpach (chris@nice.ch)
|
|||
ns_get_foreign_selection (Lisp_Object symbol, Lisp_Object target)
|
||||
{
|
||||
id pb;
|
||||
pb =[NSPasteboard pasteboardWithName: symbol_to_nsstring (symbol)];
|
||||
return ns_string_from_pasteboard (pb);
|
||||
pb = ns_symbol_to_pb (symbol);
|
||||
return pb != nil ? ns_string_from_pasteboard (pb) : Qnil;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
ns_handle_selection_request (struct input_event *event)
|
||||
{
|
||||
// FIXME: BIG UGLY HACK!!!
|
||||
id pb = (id)*(EMACS_INT*)&(event->x);
|
||||
NSString *type = (NSString *)*(EMACS_INT*)&(event->y);
|
||||
Lisp_Object selection_name, selection_data, target_symbol, data;
|
||||
Lisp_Object successful_p, rest;
|
||||
|
||||
selection_name = ns_string_to_symbol ([(NSPasteboard *)pb name]);
|
||||
target_symbol = ns_string_to_symbol (type);
|
||||
selection_data = assq_no_quit (selection_name, Vselection_alist);
|
||||
successful_p = Qnil;
|
||||
|
||||
if (!NILP (selection_data))
|
||||
{
|
||||
data = ns_get_local_selection (selection_name, target_symbol);
|
||||
if (!NILP (data))
|
||||
{
|
||||
if (STRINGP (data))
|
||||
ns_string_to_pasteboard_internal (pb, data, type);
|
||||
successful_p = Qt;
|
||||
}
|
||||
}
|
||||
|
||||
if (!EQ (Vns_sent_selection_hooks, Qunbound))
|
||||
{
|
||||
for (rest = Vns_sent_selection_hooks; CONSP (rest); rest = Fcdr (rest))
|
||||
call3 (Fcar (rest), selection_name, target_symbol, successful_p);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
ns_handle_selection_clear (struct input_event *event)
|
||||
{
|
||||
id pb = (id)*(EMACS_INT*)&(event->x);
|
||||
Lisp_Object selection_name, selection_data, rest;
|
||||
|
||||
selection_name = ns_string_to_symbol ([(NSPasteboard *)pb name]);
|
||||
selection_data = assq_no_quit (selection_name, Vselection_alist);
|
||||
if (NILP (selection_data)) return;
|
||||
|
||||
if (EQ (selection_data, Fcar (Vselection_alist)))
|
||||
Vselection_alist = Fcdr (Vselection_alist);
|
||||
else
|
||||
{
|
||||
for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest))
|
||||
if (EQ (selection_data, Fcar (Fcdr (rest))))
|
||||
Fsetcdr (rest, Fcdr (Fcdr (rest)));
|
||||
}
|
||||
|
||||
if (!EQ (Vns_lost_selection_hooks, Qunbound))
|
||||
{
|
||||
for (rest = Vns_lost_selection_hooks;CONSP (rest); rest = Fcdr (rest))
|
||||
call1 (Fcar (rest), selection_name);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ==========================================================================
|
||||
|
|
@ -401,29 +345,44 @@ Updated by Christian Limpach (chris@nice.ch)
|
|||
{
|
||||
id pb;
|
||||
Lisp_Object old_value, new_value;
|
||||
NSString *type;
|
||||
Lisp_Object successful_p = Qnil, rest;
|
||||
Lisp_Object target_symbol, data;
|
||||
|
||||
|
||||
check_ns ();
|
||||
CHECK_SYMBOL (selection_name);
|
||||
if (NILP (selection_value))
|
||||
error ("selection-value may not be nil.");
|
||||
pb =[NSPasteboard pasteboardWithName: symbol_to_nsstring (selection_name)];
|
||||
pb = ns_symbol_to_pb (selection_name);
|
||||
if (pb == nil) return Qnil;
|
||||
|
||||
ns_declare_pasteboard (pb);
|
||||
old_value = assq_no_quit (selection_name, Vselection_alist);
|
||||
new_value = Fcons (selection_name, Fcons (selection_value, Qnil));
|
||||
|
||||
if (NILP (old_value))
|
||||
Vselection_alist = Fcons (new_value, Vselection_alist);
|
||||
else
|
||||
Fsetcdr (old_value, Fcdr (new_value));
|
||||
/* XXX An evil hack, but a necessary one I fear XXX */
|
||||
{
|
||||
struct input_event ev;
|
||||
ev.kind = SELECTION_REQUEST_EVENT;
|
||||
ev.modifiers = 0;
|
||||
ev.code = 0;
|
||||
*(EMACS_INT*)(&(ev.x)) = (EMACS_INT)pb; // FIXME: BIG UGLY HACK!!
|
||||
*(EMACS_INT*)(&(ev.y)) = (EMACS_INT)NSStringPboardType;
|
||||
ns_handle_selection_request (&ev);
|
||||
}
|
||||
|
||||
/* We only support copy of text. */
|
||||
type = NSStringPboardType;
|
||||
target_symbol = ns_string_to_symbol (type);
|
||||
data = ns_get_local_selection (selection_name, target_symbol);
|
||||
if (!NILP (data))
|
||||
{
|
||||
if (STRINGP (data))
|
||||
ns_string_to_pasteboard_internal (pb, data, type);
|
||||
successful_p = Qt;
|
||||
}
|
||||
|
||||
if (!EQ (Vns_sent_selection_hooks, Qunbound))
|
||||
{
|
||||
for (rest = Vns_sent_selection_hooks; CONSP (rest); rest = Fcdr (rest))
|
||||
call3 (Fcar (rest), selection_name, target_symbol, successful_p);
|
||||
}
|
||||
|
||||
return selection_value;
|
||||
}
|
||||
|
||||
|
|
@ -438,8 +397,8 @@ Updated by Christian Limpach (chris@nice.ch)
|
|||
CHECK_SYMBOL (selection_name);
|
||||
if (NILP (assq_no_quit (selection_name, Vselection_alist))) return Qnil;
|
||||
|
||||
pb =[NSPasteboard pasteboardWithName: symbol_to_nsstring (selection_name)];
|
||||
ns_undeclare_pasteboard (pb);
|
||||
pb = ns_symbol_to_pb (selection_name);
|
||||
if (pb != nil) ns_undeclare_pasteboard (pb);
|
||||
return Qt;
|
||||
}
|
||||
|
||||
|
|
@ -460,8 +419,10 @@ Updated by Christian Limpach (chris@nice.ch)
|
|||
CHECK_SYMBOL (selection);
|
||||
if (EQ (selection, Qnil)) selection = QPRIMARY;
|
||||
if (EQ (selection, Qt)) selection = QSECONDARY;
|
||||
pb =[NSPasteboard pasteboardWithName: symbol_to_nsstring (selection)];
|
||||
types =[pb types];
|
||||
pb = ns_symbol_to_pb (selection);
|
||||
if (pb == nil) return Qnil;
|
||||
|
||||
types = [pb types];
|
||||
return ([types count] == 0) ? Qnil : Qt;
|
||||
}
|
||||
|
||||
|
|
@ -511,45 +472,31 @@ Updated by Christian Limpach (chris@nice.ch)
|
|||
}
|
||||
|
||||
|
||||
#ifdef CUT_BUFFER_SUPPORT
|
||||
DEFUN ("ns-get-cut-buffer-internal", Fns_get_cut_buffer_internal,
|
||||
Sns_get_cut_buffer_internal, 1, 1, 0,
|
||||
doc: /* Returns the value of the named cut buffer. */)
|
||||
(Lisp_Object buffer)
|
||||
DEFUN ("ns-get-selection-internal", Fns_get_selection_internal,
|
||||
Sns_get_selection_internal, 1, 1, 0,
|
||||
doc: /* Returns the value of SELECTION as a string.
|
||||
SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'. */)
|
||||
(Lisp_Object selection)
|
||||
{
|
||||
id pb;
|
||||
check_ns ();
|
||||
pb =[NSPasteboard pasteboardWithName: symbol_to_nsstring (buffer)];
|
||||
return ns_string_from_pasteboard (pb);
|
||||
pb = ns_symbol_to_pb (selection);
|
||||
return pb != nil ? ns_string_from_pasteboard (pb) : Qnil;
|
||||
}
|
||||
|
||||
|
||||
DEFUN ("ns-rotate-cut-buffers-internal", Fns_rotate_cut_buffers_internal,
|
||||
Sns_rotate_cut_buffers_internal, 1, 1, 0,
|
||||
doc: /* Rotate the values of the cut buffers by N steps.
|
||||
Positive N means move values forward, negative means
|
||||
backward. CURRENTLY NOT IMPLEMENTED UNDER NEXTSTEP. */ )
|
||||
(Lisp_Object n)
|
||||
{
|
||||
/* XXX This function is unimplemented under NeXTstep XXX */
|
||||
Fsignal (Qquit, Fcons (build_string (
|
||||
"Warning: ns-rotate-cut-buffers-internal not implemented\n"), Qnil));
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
|
||||
DEFUN ("ns-store-cut-buffer-internal", Fns_store_cut_buffer_internal,
|
||||
Sns_store_cut_buffer_internal, 2, 2, 0,
|
||||
doc: /* Sets the value of the named cut buffer (typically CUT_BUFFER0). */)
|
||||
(Lisp_Object buffer, Lisp_Object string)
|
||||
DEFUN ("ns-store-selection-internal", Fns_store_selection_internal,
|
||||
Sns_store_selection_internal, 2, 2, 0,
|
||||
doc: /* Sets the string value of SELECTION.
|
||||
SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'. */)
|
||||
(Lisp_Object selection, Lisp_Object string)
|
||||
{
|
||||
id pb;
|
||||
check_ns ();
|
||||
pb =[NSPasteboard pasteboardWithName: symbol_to_nsstring (buffer)];
|
||||
ns_string_to_pasteboard (pb, string);
|
||||
pb = ns_symbol_to_pb (selection);
|
||||
if (pb != nil) ns_string_to_pasteboard (pb, string);
|
||||
return Qnil;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void
|
||||
|
|
@ -572,11 +519,8 @@ Updated by Christian Limpach (chris@nice.ch)
|
|||
defsubr (&Sx_own_selection_internal);
|
||||
defsubr (&Sx_selection_exists_p);
|
||||
defsubr (&Sx_selection_owner_p);
|
||||
#ifdef CUT_BUFFER_SUPPORT
|
||||
defsubr (&Sns_get_cut_buffer_internal);
|
||||
defsubr (&Sns_rotate_cut_buffers_internal);
|
||||
defsubr (&Sns_store_cut_buffer_internal);
|
||||
#endif
|
||||
defsubr (&Sns_get_selection_internal);
|
||||
defsubr (&Sns_store_selection_internal);
|
||||
|
||||
Vselection_alist = Qnil;
|
||||
staticpro (&Vselection_alist);
|
||||
|
|
|
|||
Loading…
Reference in a new issue