From: Jan Djärv Date: Sat, 21 Jul 2012 10:23:21 +0000 (+0200) Subject: * nsterm.m (accessibilityAttributeValue): New function.. X-Git-Tag: emacs-24.2.90~1114 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=c4328746b51eb870cdf0b17a97b08a5eb0798fd2;p=emacs.git * nsterm.m (accessibilityAttributeValue): New function.. Fixes: debbugs:11134 --- diff --git a/src/ChangeLog b/src/ChangeLog index e5a0736cddc..f5c8b2093e1 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2012-07-21 Jan Djärv + + * nsterm.m (accessibilityAttributeValue): New function. (Bug#11134). + 2012-07-21 Chong Yidong * window.c (decode_any_window): Signal an error if the window is diff --git a/src/nsterm.m b/src/nsterm.m index c13fb6623f5..e4c9147dd0e 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -55,7 +55,7 @@ GNUstep port and post-20 update by Adrian Robert (arobert@cogsci.ucsd.edu) #include "window.h" #include "keyboard.h" - +#include "buffer.h" #include "font.h" /* call tracing */ @@ -6038,6 +6038,61 @@ ns_term_shutdown (int sig) @implementation EmacsWindow +- (id)accessibilityAttributeValue:(NSString *)attribute +{ + Lisp_Object str = Qnil; + struct frame *f = SELECTED_FRAME (); + struct buffer *curbuf = XBUFFER (XWINDOW (f->selected_window)->buffer); + + if ([attribute isEqualToString:NSAccessibilityRoleAttribute]) + return NSAccessibilityTextFieldRole; + + if ([attribute isEqualToString:NSAccessibilitySelectedTextAttribute] + && curbuf && ! NILP (BVAR (curbuf, mark_active))) + { + str = ns_get_local_selection (QPRIMARY, QUTF8_STRING); + } + else if (curbuf && [attribute isEqualToString:NSAccessibilityValueAttribute]) + { + if (! NILP (BVAR (curbuf, mark_active))) + str = ns_get_local_selection (QPRIMARY, QUTF8_STRING); + + if (NILP (str)) + { + ptrdiff_t start_byte = BUF_BEGV_BYTE (curbuf); + ptrdiff_t byte_range = BUF_ZV_BYTE (curbuf) - start_byte; + ptrdiff_t range = BUF_ZV (curbuf) - BUF_BEGV (curbuf); + + if (! NILP (BVAR (curbuf, enable_multibyte_characters))) + str = make_uninit_multibyte_string (range, byte_range); + else + str = make_uninit_string (range); + /* To check: This returns emacs-utf-8, which is a superset of utf-8. + Is this a problem? */ + memcpy (SDATA (str), BYTE_POS_ADDR (start_byte), byte_range); + } + } + + + if (! NILP (str)) + { + if (CONSP (str) && SYMBOLP (XCAR (str))) + { + str = XCDR (str); + if (CONSP (str) && NILP (XCDR (str))) + str = XCAR (str); + } + if (STRINGP (str)) + { + const char *utfStr = SSDATA (str); + NSString *nsStr = [NSString stringWithUTF8String: utfStr]; + return nsStr; + } + } + + return [super accessibilityAttributeValue:attribute]; +} + /* If we have multiple monitors, one above the other, we don't want to restrict the height to just one monitor. So we override this. */ - (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen