Skip to content

Instantly share code, notes, and snippets.

@ashizawa
Forked from takaxp/emacs-24.5-inline.patch
Last active September 14, 2015 07:11
Show Gist options
  • Save ashizawa/cf2be646078512edd857 to your computer and use it in GitHub Desktop.
Save ashizawa/cf2be646078512edd857 to your computer and use it in GitHub Desktop.

Revisions

  1. @takaxp takaxp created this gist Apr 11, 2015.
    1,227 changes: 1,227 additions & 0 deletions emacs-24.5-inline.patch
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,1227 @@
    diff -crN emacs-24.5/configure.ac emacs-24.5_patched/configure.ac
    *** emacs-24.5/configure.ac 2015-04-02 16:23:06.000000000 +0900
    --- emacs-24.5_patched/configure.ac 2015-04-12 00:10:11.000000000 +0900
    ***************
    *** 1782,1788 ****
    INSTALL_ARCH_INDEP_EXTRA=
    fi

    ! NS_OBJC_OBJ="nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o $macfont_file"
    fi
    CFLAGS="$tmp_CFLAGS"
    CPPFLAGS="$tmp_CPPFLAGS"
    --- 1782,1788 ----
    INSTALL_ARCH_INDEP_EXTRA=
    fi

    ! NS_OBJC_OBJ="nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o macim.o $macfont_file"
    fi
    CFLAGS="$tmp_CFLAGS"
    CPPFLAGS="$tmp_CPPFLAGS"
    ***************
    *** 4876,4882 ****
    ## only costs about 1.5K of wasted binary space.
    headerpad_extra=1000
    if test "$HAVE_NS" = "yes"; then
    ! libs_nsgui="-framework AppKit"
    if test "$NS_IMPL_COCOA" = "yes"; then
    libs_nsgui="$libs_nsgui -framework IOKit"
    fi
    --- 4876,4882 ----
    ## only costs about 1.5K of wasted binary space.
    headerpad_extra=1000
    if test "$HAVE_NS" = "yes"; then
    ! libs_nsgui="-framework AppKit -framework Carbon -framework Cocoa"
    if test "$NS_IMPL_COCOA" = "yes"; then
    libs_nsgui="$libs_nsgui -framework IOKit"
    fi
    diff -crN emacs-24.5/lisp/term/common-win.el emacs-24.5_patched/lisp/term/common-win.el
    *** emacs-24.5/lisp/term/common-win.el 2015-04-02 16:23:06.000000000 +0900
    --- emacs-24.5_patched/lisp/term/common-win.el 2015-04-12 00:10:11.000000000 +0900
    ***************
    *** 136,141 ****
    --- 136,142 ----
    (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 -crN emacs-24.5/lisp/term/ns-win.el emacs-24.5_patched/lisp/term/ns-win.el
    *** emacs-24.5/lisp/term/ns-win.el 2015-04-02 16:23:06.000000000 +0900
    --- emacs-24.5_patched/lisp/term/ns-win.el 2015-04-12 00:10:11.000000000 +0900
    ***************
    *** 168,174 ****
    (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)
    !

    ;; Set up a number of aliases and other layers to pretend we're using
    ;; the Choi/Mitsuharu Carbon port.
    --- 168,174 ----
    (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 Choi/Mitsuharu Carbon port.
    ***************
    *** 253,266 ****
    ;; 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.
    --- 253,282 ----
    ;; 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.
    ***************
    *** 268,284 ****
    (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
    --- 284,304 ----
    (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
    ***************
    *** 308,326 ****
    (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?
    --- 328,407 ----
    (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?
    ***************
    *** 963,968 ****
    --- 1044,1509 ----
    (add-to-list 'frame-creation-function-alist '(ns . x-create-frame-with-faces))
    (add-to-list 'window-system-initialization-alist '(ns . ns-initialize-window-system))

    +
    + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    + ;;
    + ;; Implementation of Input Method Extension for MacOS X
    + ;; written by Taiichi Hashimoto <[email protected]>
    + ;;
    +
    + (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.atok21.Roman"
    + (title . "A")
    + (cursor-color)
    + (cursor-type))
    + ("com.justsystems.inputmethod.atok21.Japanese"
    + (title . "あ")
    + (cursor-color)
    + (cursor-type))
    + ("com.justsystems.inputmethod.atok21.Japanese.Katakana"
    + (title . "ア")
    + (cursor-color)
    + (cursor-type))
    + ("com.justsystems.inputmethod.atok21.Japanese.FullWidthRoman"
    + (title . "英")
    + (cursor-color)
    + (cursor-type))
    + ("com.justsystems.inputmethod.atok21.Japanese.HalfWidthEiji"
    + (title . "半英")
    + (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))
    + ("com.justsystems.inputmethod.atok25.Roman"
    + (title . "A")
    + (cursor-color)
    + (cursor-type))
    + ("com.justsystems.inputmethod.atok25.Japanese"
    + (title . "あ")
    + (cursor-color)
    + (cursor-type))
    + ("com.justsystems.inputmethod.atok25.Japanese.Katakana"
    + (title . "ア")
    + (cursor-color)
    + (cursor-type))
    + ("com.justsystems.inputmethod.atok25.Japanese.FullWidthRoman"
    + (title . "英")
    + (cursor-color)
    + (cursor-type))
    + ("com.justsystems.inputmethod.atok25.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)

    diff -crN emacs-24.5/src/Makefile.in emacs-24.5_patched/src/Makefile.in
    *** emacs-24.5/src/Makefile.in 2015-04-02 16:23:06.000000000 +0900
    --- emacs-24.5_patched/src/Makefile.in 2015-04-12 00:10:11.000000000 +0900
    ***************
    *** 367,374 ****
    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 macfont.o \
    ! w32.o w32console.o w32fns.o w32heap.o w32inevt.o w32notify.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 \
    xsettings.o xgselect.o termcap.o
    --- 367,374 ----
    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 macfont.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 \
    xsettings.o xgselect.o termcap.o
    diff -crN emacs-24.5/src/keyboard.c emacs-24.5_patched/src/keyboard.c
    *** emacs-24.5/src/keyboard.c 2015-04-02 16:23:06.000000000 +0900
    --- emacs-24.5_patched/src/keyboard.c 2015-04-12 00:10:11.000000000 +0900
    ***************
    *** 3965,3972 ****
    {
    if (event->code == KEY_NS_PUT_WORKING_TEXT)
    obj = list1 (intern ("ns-put-working-text"));
    ! else
    obj = list1 (intern ("ns-unput-working-text"));
    kbd_fetch_ptr = event + 1;
    if (used_mouse_menu)
    *used_mouse_menu = 1;
    --- 3965,3974 ----
    {
    if (event->code == KEY_NS_PUT_WORKING_TEXT)
    obj = list1 (intern ("ns-put-working-text"));
    ! else if (event->code == KEY_NS_UNPUT_WORKING_TEXT)
    obj = list1 (intern ("ns-unput-working-text"));
    + 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;
    ***************
    *** 11707,11712 ****
    --- 11709,11716 ----
    "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 -crN emacs-24.5/src/macim.m emacs-24.5_patched/src/macim.m
    *** emacs-24.5/src/macim.m 1970-01-01 09:00:00.000000000 +0900
    --- emacs-24.5_patched/src/macim.m 2015-04-12 00:10:11.000000000 +0900
    ***************
    *** 0 ****
    --- 1,173 ----
    + /* Implementation of Input Method Extension for MacOS X.
    + Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
    + Taiichi Hashimoto <[email protected]>.
    + */
    +
    + #include "config.h"
    +
    + #ifdef NS_IMPL_COCOA
    +
    + #include <math.h>
    + #include <sys/types.h>
    + #include <time.h>
    + #include <signal.h>
    + #include <unistd.h>
    +
    + #include <Carbon/Carbon.h>
    +
    + #include "lisp.h"
    + #include "blockinput.h"
    +
    + #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;
    + NSArray *languages = [NSLocale preferredLanguages];
    + if (languages != nil) {
    + locale = [languages objectAtIndex:0];
    + } else {
    + locale = [[NSLocale currentLocale]
    + objectForKey:NSLocaleLanguageCode];
    + }
    + 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 -crN emacs-24.5/src/nsfns.m emacs-24.5_patched/src/nsfns.m
    *** emacs-24.5/src/nsfns.m 2015-04-02 16:23:06.000000000 +0900
    --- emacs-24.5_patched/src/nsfns.m 2015-04-12 00:10:11.000000000 +0900
    ***************
    *** 2966,2971 ****
    --- 2966,2989 ----
    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);
    ***************
    *** 3009,3014 ****
    --- 3027,3036 ----
    defsubr (&Sx_show_tip);
    defsubr (&Sx_hide_tip);

    + #ifdef NS_IMPL_COCOA
    + mac_init_input_method ();
    + #endif
    +
    as_status = 0;
    as_script = Qnil;
    as_result = 0;
    diff -crN emacs-24.5/src/nsterm.h emacs-24.5_patched/src/nsterm.h
    *** emacs-24.5/src/nsterm.h 2015-04-02 16:23:06.000000000 +0900
    --- emacs-24.5_patched/src/nsterm.h 2015-04-12 00:10:11.000000000 +0900
    ***************
    *** 476,481 ****
    --- 476,483 ----
    #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 -crN emacs-24.5/src/nsterm.m emacs-24.5_patched/src/nsterm.m
    *** emacs-24.5/src/nsterm.m 2015-04-02 16:23:06.000000000 +0900
    --- emacs-24.5_patched/src/nsterm.m 2015-04-12 00:10:21.000000000 +0900
    ***************
    *** 4274,4279 ****
    --- 4274,4282 ----
    /* [[NSNotificationCenter defaultCenter] addObserver: NSApp
    selector: @selector (logNotification:)
    name: nil object: nil]; */
    + [[NSDistributedNotificationCenter defaultCenter] addObserver: NSApp
    + selector: @selector (changeInputMethod:)
    + name: @"AppleSelectedInputSourcesChangedNotification" object: nil];

    dpyinfo = xzalloc (sizeof *dpyinfo);

    ***************
    *** 4551,4556 ****
    --- 4554,4574 ----
    NSLog (@"notification: '%@'", [notification name]);
    }

    + - (void)changeInputMethod: (NSNotification *)notification
    + {
    +
    + struct frame *emacsframe = SELECTED_FRAME ();
    +
    + if (mac_store_change_input_method_event())
    + {
    + if (!emacs_event)
    + return;
    + 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
    /* --------------------------------------------------------------------------
    ***************
    *** 5342,5348 ****
    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] */
    --- 5360,5367 ----
    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] */
    ***************
    *** 5357,5365 ****
    ? MULTIBYTE_CHAR_KEYSTROKE_EVENT : ASCII_KEYSTROKE_EVENT;

    emacs_event->code = code;
    ! EV_TRAILER (theEvent);
    ! processingCompose = NO;
    ! return;
    }
    }

    --- 5376,5394 ----
    ? 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);
    ! processingCompose = NO;
    ! return;
    ! }
    }
    }

    ***************
    *** 5459,5468 ****
    (unsigned long)selRange.length,
    (unsigned long)selRange.location);

    - if (workingText != nil)
    - [self deleteWorkingText];
    if ([str length] == 0)
    ! return;

    if (!emacs_event)
    return;
    --- 5488,5506 ----
    (unsigned long)selRange.length,
    (unsigned long)selRange.location);

    if ([str length] == 0)
    ! {
    ! [self deleteWorkingText];
    ! return;
    ! }
    ! else
    ! {
    ! if (workingText != nil) {
    ! [workingText release];
    ! workingText = nil;
    ! processingCompose = NO;
    ! }
    ! }

    if (!emacs_event)
    return;
    ***************
    *** 5472,5478 ****
    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);
    }

    --- 5510,5518 ----
    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);
    }

    ***************
    *** 5527,5541 ****
    {
    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];
    --- 5567,5588 ----
    {
    NSRect rect;
    NSPoint pt;
    ! 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];
    ***************
    *** 7792,7797 ****
    --- 7839,7848 ----
    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 (Qns, Qnil);

    diff -crN emacs-24.5/src/termhooks.h emacs-24.5_patched/src/termhooks.h
    *** emacs-24.5/src/termhooks.h 2015-04-02 16:23:06.000000000 +0900
    --- emacs-24.5_patched/src/termhooks.h 2015-04-12 00:10:11.000000000 +0900
    ***************
    *** 49,54 ****
    --- 49,55 ----
    output_x_window,
    output_msdos_raw,
    output_w32,
    + output_mac,
    output_ns
    };