*** ../emacs-24.3.org/configure 2013-03-08 17:13:36.000000000 +0900 --- ./configure 2013-03-31 19:29:40.000000000 +0900 *************** if test "${HAVE_NS}" = yes; then *** 9650,9656 **** leimdir="\${ns_appresdir}/leim" INSTALL_ARCH_INDEP_EXTRA= fi ! NS_OBJC_OBJ="nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o" fi CFLAGS="$tmp_CFLAGS" CPPFLAGS="$tmp_CPPFLAGS" --- 9650,9656 ---- leimdir="\${ns_appresdir}/leim" INSTALL_ARCH_INDEP_EXTRA= fi ! NS_OBJC_OBJ="nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o macim.o" fi CFLAGS="$tmp_CFLAGS" CPPFLAGS="$tmp_CPPFLAGS" *************** case "$opsys" in *** 24618,24624 **** ## 0x690 is the total size of 30 segment load commands (at 56 ## each); under Cocoa 31 commands are required. if test "$HAVE_NS" = "yes"; then ! libs_nsgui="-framework AppKit" headerpad_extra=6C8 else libs_nsgui= --- 24618,24624 ---- ## 0x690 is the total size of 30 segment load commands (at 56 ## each); under Cocoa 31 commands are required. if test "$HAVE_NS" = "yes"; then ! libs_nsgui="-framework AppKit -framework Carbon" headerpad_extra=6C8 else libs_nsgui= *** ../emacs-24.3.org/src/Makefile.in 2013-01-02 05:37:17.000000000 +0900 --- src/Makefile.in 2013-03-31 19:30:13.000000000 +0900 *************** obj = $(base_obj) $(NS_OBJC_OBJ) *** 356,362 **** SOME_MACHINE_OBJECTS = dosfns.o msdos.o \ xterm.o xfns.o xmenu.o xselect.o xrdb.o xsmfns.o fringe.o image.o \ fontset.o dbusbind.o cygw32.o \ ! nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o \ w32.o w32console.o w32fns.o w32heap.o w32inevt.o \ w32menu.o w32proc.o w32reg.o w32select.o w32term.o w32xfns.o \ w16select.o widget.o xfont.o ftfont.o xftfont.o ftxfont.o gtkutil.o \ --- 356,362 ---- SOME_MACHINE_OBJECTS = dosfns.o msdos.o \ xterm.o xfns.o xmenu.o xselect.o xrdb.o xsmfns.o fringe.o image.o \ fontset.o dbusbind.o cygw32.o \ ! nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o macim.o\ w32.o w32console.o w32fns.o w32heap.o w32inevt.o \ w32menu.o w32proc.o w32reg.o w32select.o w32term.o w32xfns.o \ w16select.o widget.o xfont.o ftfont.o xftfont.o ftxfont.o gtkutil.o \ diff -r -N -p ../emacs-24.0.96/src/keyboard.c src/keyboard.c *** ../emacs-24.0.96/src/keyboard.c 2012-04-08 12:03:02.000000000 +0900 --- src/keyboard.c 2012-05-03 22:23:59.000000000 +0900 *************** kbd_buffer_get_event (KBOARD **kbp, *** 3915,3922 **** { if (event->code == KEY_NS_PUT_WORKING_TEXT) obj = Fcons (intern ("ns-put-working-text"), Qnil); ! else obj = Fcons (intern ("ns-unput-working-text"), Qnil); kbd_fetch_ptr = event + 1; if (used_mouse_menu) *used_mouse_menu = 1; --- 3915,3924 ---- { if (event->code == KEY_NS_PUT_WORKING_TEXT) obj = Fcons (intern ("ns-put-working-text"), Qnil); ! else if (event->code == KEY_NS_UNPUT_WORKING_TEXT) obj = Fcons (intern ("ns-unput-working-text"), Qnil); + else if (event->code == KEY_NS_PUT_MARKED_TEXT) + obj = Fcons (intern ("ns-put-marked-text"), event->arg); kbd_fetch_ptr = event + 1; if (used_mouse_menu) *used_mouse_menu = 1; *************** keys_of_keyboard (void) *** 12332,12337 **** --- 12334,12341 ---- "ns-put-working-text"); initial_define_lispy_key (Vspecial_event_map, "ns-unput-working-text", "ns-unput-working-text"); + initial_define_lispy_key (Vspecial_event_map, "ns-put-marked-text", + "ns-put-marked-text"); /* Here we used to use `ignore-event' which would simple set prefix-arg to current-prefix-arg, as is done in `handle-switch-frame'. But `handle-switch-frame is not run from the special-map. diff -r -N -p ../emacs-24.0.96/src/macim.m src/macim.m *** ../emacs-24.0.96/src/macim.m 1970-01-01 09:00:00.000000000 +0900 --- src/macim.m 2012-05-03 22:23:59.000000000 +0900 *************** *** 0 **** --- 1,177 ---- + /* Implementation of Input Method Extension for MacOS X. + Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 + Taiichi Hashimoto . + */ + + #include "config.h" + + #ifdef NS_IMPL_COCOA + + #include + #include + #include + #include + #include + + #include + + #include "lisp.h" + #include "blockinput.h" + + enum output_method + { + output_initial, + output_termcap, + output_x_window, + output_msdos_raw, + output_w32, + output_mac, + output_ns + } output_method; + + #include "termhooks.h" + #include "keyboard.h" + #include "buffer.h" + + //extern Lisp_Object Qcurrent_input_method; + //extern int cursor_in_echo_area; + static Lisp_Object Qmac_keys_passed_to_system; + + void mac_init_input_method (); + int mac_pass_key_to_system (int code, int modifiers); + int mac_pass_key_directly_to_emacs (); + int mac_store_change_input_method_event (); + + DEFUN ("mac-input-source-is-ascii-capable", Fmac_input_source_is_ascii_capable, Smac_input_source_is_ascii_capable, + 0, 0, 0, + doc: /* Is current input source ascii capable? */) + (void) + { + TISInputSourceRef is = TISCopyCurrentKeyboardInputSource(); + CFBooleanRef ret = TISGetInputSourceProperty(is, kTISPropertyInputSourceIsASCIICapable); + + return CFBooleanGetValue(ret)? Qt : Qnil; + } + + DEFUN ("mac-get-input-source-list", Fmac_get_input_source_list, Smac_get_input_source_list, + 0, 0, 0, + doc: /* get input source list on MacOSX */) + (void) + { + NSArray *is_list = (NSArray *)TISCreateInputSourceList(NULL, false); + int list_size = [is_list count]; + Lisp_Object list[list_size]; + int i; + + for (i = 0; i < list_size; i++) { + TISInputSourceRef is = (TISInputSourceRef)[is_list objectAtIndex:i]; + NSString *id = (NSString *)TISGetInputSourceProperty(is, kTISPropertyInputSourceID); + list[i] = make_string([id UTF8String], + [id lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); + } + + return Flist(list_size, list); + } + + DEFUN ("mac-get-current-input-source", Fmac_get_current_input_source, Smac_get_current_input_source, + 0, 0, 0, + doc: /* get current input source on MacOSX */) + (void) + { + TISInputSourceRef is = TISCopyCurrentKeyboardInputSource(); + NSString *id = (NSString *)TISGetInputSourceProperty(is, kTISPropertyInputSourceID); + + return make_string([id UTF8String], + [id lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); + } + + DEFUN ("mac-toggle-input-source", Fmac_toggle_input_source, Smac_toggle_input_source, + 1, 1, 0, + doc: /* toggle input source on MacOSX */) + (arg) + Lisp_Object arg; + { + TISInputSourceRef is = NULL; + + if (NILP (arg)) + { + is = TISCopyCurrentASCIICapableKeyboardInputSource(); + } + else + { + NSString *locale = [[NSLocale currentLocale] localeIdentifier]; + is = TISCopyInputSourceForLanguage((CFStringRef)locale); + } + if (is) TISSelectInputSource(is); + + return arg; + } + + int + mac_store_change_input_method_event () + { + Lisp_Object dim; + int ret = FALSE; + + dim = Fsymbol_value (intern ("default-input-method")); + if (STRINGP (dim) && strcmp(SDATA (dim), "MacOSX") == 0) + { + ret = TRUE; + } + + return ret; + } + + int + mac_pass_key_to_system (int code, int modifiers) + { + Lisp_Object keys = Fsymbol_value (Qmac_keys_passed_to_system); + Lisp_Object m, k; + + while (!NILP (keys)) + { + m = XCAR (XCAR (keys)); + k = XCDR (XCAR (keys)); + keys = XCDR (keys); + + if (NUMBERP (m) && modifiers == XINT (m)) + if (NILP (k) + || (NUMBERP (k) && code == XINT (k))) + return TRUE; + } + + return FALSE; + } + + int + mac_pass_key_directly_to_emacs (void) + { + + if (NILP (Fmac_input_source_is_ascii_capable())) + { + if (NILP (Vmac_use_input_method_on_system) + || this_command_key_count + || cursor_in_echo_area + || !NILP (BVAR (current_buffer, read_only))) + return TRUE; + } + + return FALSE; + } + + + void mac_init_input_method (void) + { + Qmac_keys_passed_to_system = intern ("mac-keys-passed-to-system"); + staticpro (&Qmac_keys_passed_to_system); + + DEFVAR_LISP ("mac-use-input-method-on-system", Vmac_use_input_method_on_system, + doc: /* If it is non-nil, use input method on system. */); + Vmac_use_input_method_on_system = Qt; + + defsubr (&Smac_input_source_is_ascii_capable); + defsubr (&Smac_get_input_source_list); + defsubr (&Smac_get_current_input_source); + defsubr (&Smac_toggle_input_source); + } + #endif diff -r -N -p ../emacs-24.0.96/src/nsfns.m src/nsfns.m *** ../emacs-24.0.96/src/nsfns.m 2012-04-08 12:03:02.000000000 +0900 --- src/nsfns.m 2012-05-04 00:05:24.000000000 +0900 *************** static ptrdiff_t image_cache_refcount; *** 111,117 **** ========================================================================== */ - void check_ns (void) { --- 111,116 ---- *************** be used as the image of the icon represe *** 2722,2727 **** --- 2721,2744 ---- doc: /* Toolkit version for NS Windowing. */); Vns_version_string = ns_appkit_version_str (); + + DEFVAR_LISP ("ns-shift-key-mask", Vns_shift_key_mask, + doc: /* Shift key mask defined in system. */); + Vns_shift_key_mask = make_number (NSShiftKeyMask); + + DEFVAR_LISP ("ns-control-key-mask", Vns_control_key_mask, + doc: /* Control key mask defined in system. */); + Vns_control_key_mask = make_number (NSControlKeyMask); + + DEFVAR_LISP ("ns-alternate-key-mask", Vns_alternate_key_mask, + doc: /* Alternate key mask defined in system. */); + Vns_alternate_key_mask = make_number (NSAlternateKeyMask); + + DEFVAR_LISP ("ns-command-key-mask", Vns_command_key_mask, + doc: /* Command key mask defined in system. */); + Vns_command_key_mask = make_number (NSCommandKeyMask); + + defsubr (&Sns_read_file_name); defsubr (&Sns_get_resource); defsubr (&Sns_set_resource); *************** be used as the image of the icon represe *** 2766,2771 **** --- 2783,2792 ---- defsubr (&Sx_show_tip); defsubr (&Sx_hide_tip); + #ifdef NS_IMPL_COCOA + mac_init_input_method (); + #endif + /* used only in fontset.c */ check_window_system_func = check_ns; diff -r -N -p ../emacs-24.0.96/src/nsterm.h src/nsterm.h *** ../emacs-24.0.96/src/nsterm.h 2012-04-08 12:03:02.000000000 +0900 --- src/nsterm.h 2012-05-03 22:23:59.000000000 +0900 *************** typedef unsigned int NSUInteger; *** 398,403 **** --- 398,405 ---- #define KEY_NS_NEW_FRAME ((1<<28)|(0<<16)|12) #define KEY_NS_TOGGLE_TOOLBAR ((1<<28)|(0<<16)|13) #define KEY_NS_SHOW_PREFS ((1<<28)|(0<<16)|14) + #define KEY_MAC_CHANGE_INPUT_METHOD ((1<<28)|(0<<16)|15) + #define KEY_NS_PUT_MARKED_TEXT ((1<<28)|(0<<16)|16) /* could use list to store these, but rest of emacs has a big infrastructure for managing a table of bitmap "records" */ diff -r -N -p ../emacs-24.0.96/src/nsterm.m src/nsterm.m *** ../emacs-24.0.96/src/nsterm.m 2012-04-09 22:08:55.000000000 +0900 --- src/nsterm.m 2012-05-04 00:12:13.000000000 +0900 *************** ns_term_init (Lisp_Object display_name) *** 4040,4045 **** --- 4040,4048 ---- /* [[NSNotificationCenter defaultCenter] addObserver: NSApp selector: @selector (logNotification:) name: nil object: nil]; */ + [[NSDistributedNotificationCenter defaultCenter] addObserver: NSApp + selector: @selector (changeInputMethod:) + name: @"AppleSelectedInputSourcesChangedNotification" object: nil]; dpyinfo = (struct ns_display_info *)xmalloc (sizeof (struct ns_display_info)); memset (dpyinfo, 0, sizeof (struct ns_display_info)); *************** ns_term_shutdown (int sig) *** 4255,4260 **** --- 4258,4276 ---- NSLog (@"notification: '%@'", [notification name]); } + - (void)changeInputMethod: (NSNotification *)notification + { + + struct frame *emacsframe = SELECTED_FRAME (); + + if (mac_store_change_input_method_event()) + { + emacs_event->kind = NS_NONKEY_EVENT; + emacs_event->code = KEY_MAC_CHANGE_INPUT_METHOD; + emacs_event->modifiers = 0; + EV_TRAILER ((id)nil); + } + } - (void)sendEvent: (NSEvent *)theEvent /* -------------------------------------------------------------------------- *************** ns_term_shutdown (int sig) *** 4857,4863 **** code, fnKeysym, flags, emacs_event->modifiers); /* if it was a function key or had modifiers, pass it directly to emacs */ ! if (fnKeysym || (emacs_event->modifiers && (emacs_event->modifiers != shift_modifier) && [[theEvent charactersIgnoringModifiers] length] > 0)) /*[[theEvent characters] length] */ --- 4872,4879 ---- code, fnKeysym, flags, emacs_event->modifiers); /* if it was a function key or had modifiers, pass it directly to emacs */ ! if (mac_pass_key_directly_to_emacs () ! ||fnKeysym || (emacs_event->modifiers && (emacs_event->modifiers != shift_modifier) && [[theEvent charactersIgnoringModifiers] length] > 0)) /*[[theEvent characters] length] */ *************** ns_term_shutdown (int sig) *** 4872,4879 **** ? MULTIBYTE_CHAR_KEYSTROKE_EVENT : ASCII_KEYSTROKE_EVENT; emacs_event->code = code; ! EV_TRAILER (theEvent); ! return; } } --- 4888,4905 ---- ? MULTIBYTE_CHAR_KEYSTROKE_EVENT : ASCII_KEYSTROKE_EVENT; emacs_event->code = code; ! /* The function mac_pass_key_to_system decides ! whether it is passed directly to emacs or not. */ ! if (emacs_event->kind == NON_ASCII_KEYSTROKE_EVENT ! || !mac_pass_key_to_system (code, flags ! & (NSShiftKeyMask ! | NSControlKeyMask ! | NSAlternateKeyMask ! | NSCommandKeyMask))) ! { ! EV_TRAILER (theEvent); ! return; ! } } } *************** ns_term_shutdown (int sig) *** 4966,4975 **** NSLog (@"setMarkedText '%@' len =%d range %d from %d", str, [str length], selRange.length, selRange.location); - if (workingText != nil) - [self deleteWorkingText]; if ([str length] == 0) ! return; if (!emacs_event) return; --- 4992,5010 ---- NSLog (@"setMarkedText '%@' len =%d range %d from %d", str, [str length], selRange.length, selRange.location); if ([str length] == 0) ! { ! [self deleteWorkingText]; ! return; ! } ! else ! { ! if (workingText != nil) { ! [workingText release]; ! workingText = nil; ! processingCompose = NO; ! } ! } if (!emacs_event) return; *************** ns_term_shutdown (int sig) *** 4979,4985 **** ns_working_text = build_string ([workingText UTF8String]); emacs_event->kind = NS_TEXT_EVENT; ! emacs_event->code = KEY_NS_PUT_WORKING_TEXT; EV_TRAILER ((id)nil); } --- 5014,5022 ---- ns_working_text = build_string ([workingText UTF8String]); emacs_event->kind = NS_TEXT_EVENT; ! emacs_event->code = KEY_NS_PUT_MARKED_TEXT; ! emacs_event->arg = Fcons (make_number (selRange.location), ! Fcons (make_number (selRange.length), Qnil)); EV_TRAILER ((id)nil); } *************** ns_term_shutdown (int sig) *** 5034,5048 **** { NSRect rect; NSPoint pt; ! struct window *win = XWINDOW (FRAME_SELECTED_WINDOW (emacsframe)); if (NS_KEYLOG) NSLog (@"firstRectForCharRange request"); rect.size.width = theRange.length * FRAME_COLUMN_WIDTH (emacsframe); rect.size.height = FRAME_LINE_HEIGHT (emacsframe); pt.x = WINDOW_TEXT_TO_FRAME_PIXEL_X (win, win->phys_cursor.x); pt.y = WINDOW_TO_FRAME_PIXEL_Y (win, win->phys_cursor.y ! +FRAME_LINE_HEIGHT (emacsframe)); pt = [self convertPoint: pt toView: nil]; pt = [[self window] convertBaseToScreen: pt]; --- 5071,5093 ---- { NSRect rect; NSPoint pt; ! // struct window *win = XWINDOW (FRAME_SELECTED_WINDOW (emacsframe)); ! struct window *win; if (NS_KEYLOG) NSLog (@"firstRectForCharRange request"); + + if (NILP (Vmac_in_echo_area)) + win = XWINDOW (FRAME_SELECTED_WINDOW (emacsframe)); + else if (WINDOWP (echo_area_window)) + win = XWINDOW (echo_area_window); + else + win = XWINDOW (FRAME_SELECTED_WINDOW (emacsframe)); rect.size.width = theRange.length * FRAME_COLUMN_WIDTH (emacsframe); rect.size.height = FRAME_LINE_HEIGHT (emacsframe); pt.x = WINDOW_TEXT_TO_FRAME_PIXEL_X (win, win->phys_cursor.x); pt.y = WINDOW_TO_FRAME_PIXEL_Y (win, win->phys_cursor.y ! +FRAME_LINE_HEIGHT (emacsframe)+2); pt = [self convertPoint: pt toView: nil]; pt = [[self window] convertBaseToScreen: pt]; *************** variable `x-use-underline-position-prope *** 6764,6769 **** --- 6809,6818 ---- baseline level. The default value is nil. */); x_underline_at_descent_line = 0; + DEFVAR_LISP ("mac-in-echo-area", Vmac_in_echo_area, + doc: /* state of cursor in echo area. */); + Vmac_in_echo_area = Qnil; + /* Tell emacs about this window system. */ Fprovide (intern ("ns"), Qnil); } diff -r -N -p ../emacs-24.0.96/lisp/term/common-win.el lisp/term/common-win.el *** ../emacs-24.0.96/lisp/term/common-win.el 2012-04-08 12:03:02.000000000 +0900 --- lisp/term/common-win.el 2012-05-03 22:23:59.000000000 +0900 *************** is not used)." *** 127,132 **** --- 127,133 ---- (cons (logior (lsh 0 16) 12) 'ns-new-frame) (cons (logior (lsh 0 16) 13) 'ns-toggle-toolbar) (cons (logior (lsh 0 16) 14) 'ns-show-prefs) + (cons (logior (lsh 0 16) 15) 'mac-change-input-method) )))) (set-terminal-parameter frame 'x-setup-function-keys t))) diff -r -N -p ../emacs-24.0.96/lisp/term/ns-win.el lisp/term/ns-win.el *** ../emacs-24.0.96/lisp/term/ns-win.el 2012-04-08 12:03:02.000000000 +0900 --- lisp/term/ns-win.el 2012-05-03 23:57:14.000000000 +0900 *************** The properties returned may include `top *** 173,178 **** --- 173,179 ---- (define-key global-map [ns-new-frame] 'make-frame) (define-key global-map [ns-toggle-toolbar] 'ns-toggle-toolbar) (define-key global-map [ns-show-prefs] 'customize) + (define-key global-map [mac-change-input-method] 'mac-change-input-method) ;; Set up a number of aliases and other layers to pretend we're using *************** The properties returned may include `top *** 259,272 **** ;; editing window.) (defface ns-working-text-face ! '((t :underline t)) "Face used to highlight working text during compose sequence insert." :group 'ns) (defvar ns-working-overlay nil "Overlay used to highlight working text during compose sequence insert. When text is in th echo area, this just stores the length of the working text.") (defvar ns-working-text) ; nsterm.m ;; Test if in echo area, based on mac-win.el 2007/08/26 unicode-2. --- 260,289 ---- ;; editing window.) (defface ns-working-text-face ! '((((background dark)) :underline "gray80") ! (t :underline "gray20")) "Face used to highlight working text during compose sequence insert." :group 'ns) + (defface ns-marked-text-face + '((((background dark)) :underline "gray80") + (t :underline "gray20")) + "Face used to highlight marked text during compose sequence insert." + :group 'ns) + + (defface ns-unmarked-text-face + '((((background dark)) :underline "gray20") + (t :underline "gray80")) + "Face used to highlight marked text during compose sequence insert." + :group 'ns) + (defvar ns-working-overlay nil "Overlay used to highlight working text during compose sequence insert. When text is in th echo area, this just stores the length of the working text.") + (defvar ns-marked-overlay nil + "Overlay used to highlight marked text during compose sequence insert.") + (defvar ns-working-text) ; nsterm.m ;; Test if in echo area, based on mac-win.el 2007/08/26 unicode-2. *************** When text is in th echo area, this just *** 274,290 **** (defun ns-in-echo-area () "Whether, for purposes of inserting working composition text, the minibuffer is currently being used." ! (or isearch-mode ! (and cursor-in-echo-area (current-message)) ! ;; Overlay strings are not shown in some cases. ! (get-char-property (point) 'invisible) ! (and (not (bobp)) ! (or (and (get-char-property (point) 'display) ! (eq (get-char-property (1- (point)) 'display) ! (get-char-property (point) 'display))) ! (and (get-char-property (point) 'composition) ! (eq (get-char-property (1- (point)) 'composition) ! (get-char-property (point) 'composition))))))) ;; The 'interactive' here stays for subinvocations, so the ns-in-echo-area ;; always returns nil for some reason. If this WASN'T the case, we could --- 291,309 ---- (defun ns-in-echo-area () "Whether, for purposes of inserting working composition text, the minibuffer is currently being used." ! (setq mac-in-echo-area ! (or isearch-mode ! (and cursor-in-echo-area (current-message)) ! ;; Overlay strings are not shown in some cases. ! (get-char-property (point) 'invisible) ! (and (not (bobp)) ! (or (and (get-char-property (point) 'display) ! (eq (get-char-property (1- (point)) 'display) ! (get-char-property (point) 'display))) ! (and (get-char-property (point) 'composition) ! (eq (get-char-property (1- (point)) 'composition) ! (get-char-property (point) 'composition))))))) ! mac-in-echo-area) ;; The 'interactive' here stays for subinvocations, so the ns-in-echo-area ;; always returns nil for some reason. If this WASN'T the case, we could *************** is currently being used." *** 293,298 **** --- 312,318 ---- (defun ns-put-working-text () (interactive) (if (ns-in-echo-area) (ns-echo-working-text) (ns-insert-working-text))) + (defun ns-unput-working-text () (interactive) (ns-delete-working-text)) *************** The overlay is assigned the face `ns-wor *** 314,332 **** (defun ns-echo-working-text () "Echo contents of `ns-working-text' in message display area. See `ns-insert-working-text'." - (ns-delete-working-text) (let* ((msg (current-message)) ! (msglen (length msg)) ! message-log-max) (setq ns-working-overlay (length ns-working-text)) (setq msg (concat msg ns-working-text)) (put-text-property msglen (+ msglen ns-working-overlay) ! 'face 'ns-working-text-face msg) (message "%s" msg))) (defun ns-delete-working-text() ! "Delete working text and clear `ns-working-overlay'." (interactive) (cond ((and (overlayp ns-working-overlay) ;; Still alive? --- 334,414 ---- (defun ns-echo-working-text () "Echo contents of `ns-working-text' in message display area. See `ns-insert-working-text'." (let* ((msg (current-message)) ! (msglen (length msg)) ! message-log-max) ! (if (integerp ns-working-overlay) ! (progn ! (setq msg (substring msg 0 (- (length msg) ns-working-overlay))) ! (setq msglen (length msg)))) (setq ns-working-overlay (length ns-working-text)) (setq msg (concat msg ns-working-text)) (put-text-property msglen (+ msglen ns-working-overlay) ! 'face 'ns-working-text-face msg) ! (message "%s" msg))) ! ! (defun ns-put-marked-text (event) ! (interactive "e") ! ! (let ((pos (nth 1 event)) ! (len (nth 2 event))) ! (if (ns-in-echo-area) ! (ns-echo-marked-text pos len) ! (ns-insert-marked-text pos len)))) ! ! (defun ns-insert-marked-text (pos len) ! "Insert contents of `ns-working-text' as UTF-8 string and mark with ! `ns-working-overlay' and `ns-marked-overlay'. Any previously existing ! working text is cleared first. The overlay is assigned the faces ! `ns-working-text-face' and `ns-marked-text-face'." ! (ns-delete-working-text) ! (let ((start (point))) ! (if (<= pos (length ns-working-text)) ! (progn ! (put-text-property pos len 'face 'ns-working-text-face ns-working-text) ! (insert ns-working-text) ! (if (= len 0) ! (overlay-put (setq ns-working-overlay ! (make-overlay start (point) (current-buffer) nil t)) ! 'face 'ns-working-text-face) ! (overlay-put (setq ns-working-overlay ! (make-overlay start (point) (current-buffer) nil t)) ! 'face 'ns-unmarked-text-face) ! (overlay-put (setq ns-marked-overlay ! (make-overlay (+ start pos) (+ start pos len) ! (current-buffer) nil t)) ! 'face 'ns-marked-text-face)) ! (goto-char (+ start pos)))))) ! ! (defun ns-echo-marked-text (pos len) ! "Echo contents of `ns-working-text' in message display area. ! See `ns-insert-working-text'." ! (let* ((msg (current-message)) ! (msglen (length msg)) ! message-log-max) ! (when (integerp ns-working-overlay) ! (setq msg (substring msg 0 (- (length msg) ns-working-overlay))) ! (setq msglen (length msg))) ! (setq ns-working-overlay (length ns-working-text)) ! (setq msg (concat msg ns-working-text)) ! (if (= len 0) ! (put-text-property msglen (+ msglen ns-working-overlay) ! 'face 'ns-working-text-face msg) ! (put-text-property msglen (+ msglen ns-working-overlay) ! 'face 'ns-unmarked-text-face msg) ! (put-text-property (+ msglen pos) (+ msglen pos len) ! 'face 'ns-marked-text-face msg)) (message "%s" msg))) (defun ns-delete-working-text() ! "Delete working text and clear `ns-working-overlay' and `ns-marked-overlay'." (interactive) + (when (and (overlayp ns-marked-overlay) + ;; Still alive + (overlay-buffer ns-marked-overlay)) + (with-current-buffer (overlay-buffer ns-marked-overlay) + (delete-overlay ns-marked-overlay))) + (setq ns-marked-overlay nil) (cond ((and (overlayp ns-working-overlay) ;; Still alive? *************** See the documentation of `create-fontset *** 931,936 **** --- 1013,1438 ---- (add-to-list 'window-system-initialization-alist '(ns . ns-initialize-window-system)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + ;; Implementation of Input Method Extension for MacOS X + ;; written by Taiichi Hashimoto + ;; + + (defvar mac-input-method-parameters + '( + ("com.apple.inputmethod.Kotoeri.Roman" + (title . "A") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.Kotoeri.Japanese" + (title . "あ") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.Kotoeri.Japanese.Katakana" + (title . "ア") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.Kotoeri.Japanese.FullWidthRoman" + (title . "A") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.Kotoeri.Japanese.HalfWidthKana" + (title . "ア") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.kotoeri.Ainu" + (title . "アイヌ") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.Korean.2SetKorean" + (title . "가2") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.Korean.3SetKorean" + (title . "가3") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.Korean.390Sebulshik" + (title . "가5") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.Korean.GongjinCheongRomaja" + (title . "가G") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.Korean.HNCRomaja" + (title . "가H") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.Tamil.AnjalIM" + (title . "Anjal") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.Tamil.Tamil99" + (title . "Tamil") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.VietnameseIM.VietnameseSimpleTelex" + (title . "ST") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.VietnameseIM.VietnameseTelex" + (title . "TX") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.VietnameseIM.VietnameseVNI" + (title . "VN") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.VietnameseIM.VietnameseVIQR" + (title . "VQ") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.SCIM.ITABC" + (title . "拼") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.SCIM.WBX" + (title . "型") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.SCIM.WBH" + (title . "画") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.TCIM.Zhuyin" + (title . "注") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.TCIM.Pinyin" + (title . "拼") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.TCIM.Cangjie" + (title . "倉") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.TCIM.Jianyi" + (title . "速") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.TCIM.Dayi" + (title . "易") + (cursor-color) + (cursor-type)) + ("com.apple.inputmethod.TCIM.Hanin" + (title . "漢") + (cursor-color) + (cursor-type)) + ("com.google.inputmethod.Japanese.Roman" + (title . "G") + (cursor-color) + (cursor-type)) + ("com.google.inputmethod.Japanese.base" + (title . "ぐ") + (cursor-color) + (cursor-type)) + ("com.google.inputmethod.Japanese.Katakana" + (title . "グ") + (cursor-color) + (cursor-type)) + ("com.google.inputmethod.Japanese.FullWidthRoman" + (title . "G") + (cursor-color) + (cursor-type)) + ("com.google.inputmethod.Japanese.HalfWidthKana" + (title . "グ") + (cursor-color) + (cursor-type)) + ("jp.monokakido.inputmethod.Kawasemi.Roman" + (title . "K") + (cursor-color) + (cursor-type)) + ("jp.monokakido.inputmethod.Kawasemi.Japanese" + (title . "か") + (cursor-color) + (cursor-type)) + ("jp.monokakido.inputmethod.Kawasemi.Japanese.Katakana" + (title . "カ") + (cursor-color) + (cursor-type)) + ("jp.monokakido.inputmethod.Kawasemi.Japanese.FullWidthRoman" + (title . "K") + (cursor-color) + (cursor-type)) + ("jp.monokakido.inputmethod.Kawasemi.Japanese.HalfWidthKana" + (title . "カ") + (cursor-color) + (cursor-type)) + ("jp.monokakido.inputmethod.Kawasemi.Japanese.HalfWidthRoman" + (title . "_K") + (cursor-color) + (cursor-type)) + ("jp.monokakido.inputmethod.Kawasemi.Japanese.Code" + (title . "C") + (cursor-color) + (cursor-type)) + ("com.justsystems.inputmethod.atok22.Roman" + (title . "A") + (cursor-color) + (cursor-type)) + ("com.justsystems.inputmethod.atok22.Japanese" + (title . "あ") + (cursor-color) + (cursor-type)) + ("com.justsystems.inputmethod.atok22.Japanese.Katakana" + (title . "ア") + (cursor-color) + (cursor-type)) + ("com.justsystems.inputmethod.atok22.Japanese.FullWidthRoman" + (title . "英") + (cursor-color) + (cursor-type)) + ("com.justsystems.inputmethod.atok22.Japanese.HalfWidthEiji" + (title . "半英") + (cursor-color) + (cursor-type)) + ("com.justsystems.inputmethod.atok23.Roman" + (title . "A") + (cursor-color) + (cursor-type)) + ("com.justsystems.inputmethod.atok23.Japanese" + (title . "あ") + (cursor-color) + (cursor-type)) + ("com.justsystems.inputmethod.atok23.Japanese.Katakana" + (title . "ア") + (cursor-color) + (cursor-type)) + ("com.justsystems.inputmethod.atok23.Japanese.FullWidthRoman" + (title . "英") + (cursor-color) + (cursor-type)) + ("com.justsystems.inputmethod.atok23.Japanese.HalfWidthEiji" + (title . "半英") + (cursor-color) + (cursor-type)) + ("com.justsystems.inputmethod.atok24.Roman" + (title . "A") + (cursor-color) + (cursor-type)) + ("com.justsystems.inputmethod.atok24.Japanese" + (title . "あ") + (cursor-color) + (cursor-type)) + ("com.justsystems.inputmethod.atok24.Japanese.Katakana" + (title . "ア") + (cursor-color) + (cursor-type)) + ("com.justsystems.inputmethod.atok24.Japanese.FullWidthRoman" + (title . "英") + (cursor-color) + (cursor-type)) + ("com.justsystems.inputmethod.atok24.Japanese.HalfWidthEiji" + (title . "半英") + (cursor-color) + (cursor-type)) + ) + "Alist of Mac script code vs parameters for input method on MacOSX.") + + + (defun mac-get-input-method-parameter (is key) + "Function to get a parameter of a input method." + (interactive) + (assq key (cdr (assoc is mac-input-method-parameters)))) + + (defun mac-get-input-method-title (&optional input-source) + "Return input method title of input source. + If input-source is nil, return one of current frame." + (if input-source + (cdr (mac-get-input-method-parameter input-source 'title)) + current-input-method-title)) + + (defun mac-get-cursor-type (&optional input-source) + "Return cursor type of input source. + If input-source is nil, return one of current frame." + (if input-source + (or (cdr (mac-get-input-method-parameter input-source 'cursor-type)) + (cdr (assq 'cursor-type default-frame-alist)) + cursor-type) + (cdr (assq 'cursor-type (frame-parameters (selected-frame)))))) + + (defun mac-get-cursor-color (&optional input-source) + "Return cursor color of input source. + If input-source is nil, return one of current frame." + (if input-source + (or (cdr (mac-get-input-method-parameter input-source 'cursor-color)) + (cdr (assq 'cursor-color default-frame-alist))) + (cdr (assq 'cursor-color (frame-parameters (selected-frame)))))) + + + (defun mac-set-input-method-parameter (is key value) + "Function to set a parameter of a input method." + (let* ((is-param (assoc is mac-input-method-parameters)) + (param (assq key is-param))) + (if is-param + (if param + (setcdr param value) + (setcdr is-param (cons (cons key value) (cdr is-param)))) + (setq mac-input-method-parameters + (cons (list is (cons key value)) + mac-input-method-parameters))))) + + + (defun mac-input-method-update (is) + "Funtion to update parameters of a input method." + (interactive) + + (let ((title (mac-get-input-method-title is)) + (type (mac-get-cursor-type is)) + (color (mac-get-cursor-color is))) + (if (and title (not (equal title (mac-get-input-method-title)))) + (setq current-input-method-title title)) + (if (and type (not (equal type (mac-get-cursor-type)))) + (setq cursor-type type)) + (if (and color (not (equal color (mac-get-cursor-color)))) + (set-cursor-color color)) + (force-mode-line-update) + (if isearch-mode (isearch-update)))) + + + (defun mac-toggle-input-method (&optional arg) + "Function to toggle input method on MacOSX." + (interactive) + + (if arg + (progn + (make-local-variable 'input-method-function) + (setq inactivate-current-input-method-function 'mac-toggle-input-method) + (setq input-method-function nil) + (setq describe-current-input-method-function nil) + (mac-toggle-input-source t)) + (kill-local-variable 'input-method-function) + (setq describe-current-input-method-function nil) + (mac-toggle-input-source nil))) + + + (defun mac-change-language-to-us () + "Function to change language to us." + (interactive) + (mac-toggle-input-method nil)) + + + (defun mac-handle-input-method-change () + "Function run when a input method change." + (interactive) + + (if (equal default-input-method "MacOSX") + (let ((input-source (mac-get-current-input-source)) + (ascii-capable (mac-input-source-is-ascii-capable))) + + (cond ((and (not current-input-method) (not ascii-capable)) + (set-input-method "MacOSX")) + ((and (equal current-input-method "MacOSX") ascii-capable) + (toggle-input-method nil))) + (mac-input-method-update input-source)))) + + ;; + ;; Emacs input method for input method on MacOSX. + ;; + (register-input-method "MacOSX" "MacOSX" 'mac-toggle-input-method + "Mac" "Input Method on MacOSX System") + + + ;; + ;; Minor mode of using input methods on MacOS X + ;; + (define-minor-mode mac-input-method-mode + "Use input methods on MacOSX." + :init-value nil + :group 'ns + :global t + + (if mac-input-method-mode + (progn + (setq default-input-method "MacOSX") + (add-hook 'minibuffer-setup-hook 'mac-change-language-to-us) + (mac-translate-from-yen-to-backslash)) + (setq default-input-method nil))) + + ;; + ;; Valiable and functions to pass key(shortcut) to system. + ;; + (defvar mac-keys-passed-to-system nil + "A list of keys passed to system on MacOSX.") + + (defun mac-add-key-passed-to-system (key) + (let ((shift '(shift shft)) + (control '(control ctrl ctl)) + (option '(option opt alternate alt)) + (command '(command cmd))) + + (add-to-list 'mac-keys-passed-to-system + (cond ((symbolp key) + (cond ((memq key shift) + (cons ns-shift-key-mask nil)) + ((memq key control) + (cons ns-control-key-mask nil)) + ((memq key option) + (cons ns-alternate-key-mask nil)) + ((memq key command) + (cons ns-command-key-mask nil)) + (t (cons nil nil)))) + ((numberp key) (cons 0 key)) + ((listp key) + (let ((l key) (k nil) (m 0)) + (while l + (cond ((memq (car l) shift) + (setq m (logior m ns-shift-key-mask))) + ((memq (car l) control) + (setq m (logior m ns-control-key-mask))) + ((memq (car l) option) + (setq m (logior m ns-alternate-key-mask))) + ((memq (car l) command) + (setq m (logior m ns-command-key-mask))) + ((numberp (car l)) + (if (not k) (setq k (car l))))) + (setq l (cdr l))) + (cons m k))) + (t (cons nil nil)))))) + + + ;; + ;; Entry Emacs event for inline input method on MacOSX. + ;; + (define-key special-event-map + [mac-change-input-method] 'mac-handle-input-method-change) + + ;; + ;; Convert yen to backslash for JIS keyboard. + ;; + (defun mac-translate-from-yen-to-backslash () + ;; Convert yen to backslash for JIS keyboard. + (interactive) + + (define-key global-map [165] nil) + (define-key global-map [2213] nil) + (define-key global-map [3420] nil) + (define-key global-map [67109029] nil) + (define-key global-map [67111077] nil) + (define-key global-map [8388773] nil) + (define-key global-map [134219941] nil) + (define-key global-map [75497596] nil) + (define-key global-map [201328805] nil) + (define-key function-key-map [165] [?\\]) + (define-key function-key-map [2213] [?\\]) ;; for Intel + (define-key function-key-map [3420] [?\\]) ;; for PowerPC + (define-key function-key-map [67109029] [?\C-\\]) + (define-key function-key-map [67111077] [?\C-\\]) + (define-key function-key-map [8388773] [?\M-\\]) + (define-key function-key-map [134219941] [?\M-\\]) + (define-key function-key-map [75497596] [?\C-\M-\\]) + (define-key function-key-map [201328805] [?\C-\M-\\]) + ) + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (provide 'ns-win) ;;; ns-win.el ends here