diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2012-01-09 09:36:10 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2012-01-09 09:36:10 -0800 |
commit | 35cf62d95cdcd5323dcea4a5385942c342ff1d9c (patch) | |
tree | 90358cbb033a126c4d48793a80fd804b7baaca24 /src/nsselect.m | |
parent | 59815c02506eb39b61e672528ed03885749ba529 (diff) | |
parent | 7655cb66d86564e792b825f1a0e1a4de7d6e6db5 (diff) | |
download | emacs-35cf62d95cdcd5323dcea4a5385942c342ff1d9c.tar.gz emacs-35cf62d95cdcd5323dcea4a5385942c342ff1d9c.tar.bz2 emacs-35cf62d95cdcd5323dcea4a5385942c342ff1d9c.zip |
Merge from trunk.
Diffstat (limited to 'src/nsselect.m')
-rw-r--r-- | src/nsselect.m | 170 |
1 files changed, 57 insertions, 113 deletions
diff --git a/src/nsselect.m b/src/nsselect.m index 9f6f35968f5..5741236c987 100644 --- a/src/nsselect.m +++ b/src/nsselect.m @@ -1,5 +1,5 @@ /* NeXT/Open/GNUstep / MacOSX Cocoa selection processing for emacs. - Copyright (C) 1993-1994, 2005-2006, 2008-2011 + Copyright (C) 1993-1994, 2005-2006, 2008-2012 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -35,8 +35,6 @@ GNUstep port and post-20 update by Adrian Robert (arobert@cogsci.ucsd.edu) #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 @@ static NSString * 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 @@ static Lisp_Object 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); -} - - -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); - } + pb = ns_symbol_to_pb (symbol); + return pb != nil ? ns_string_from_pasteboard (pb) : Qnil; } -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 @@ anything that the functions on `selection-converter-alist' know about. */) { 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 @@ DEFUN ("x-disown-selection-internal", Fx_disown_selection_internal, 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 @@ and t is the same as `SECONDARY'.) */) 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 @@ TYPE is the type of data desired, typically `STRING'. */) } -#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 @@ syms_of_nsselect (void) 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); |