Last active
December 26, 2019 23:24
-
-
Save takaxp/8da64eb5e6c8094ef9bdba1d27d529a5 to your computer and use it in GitHub Desktop.
An inline patch for Emacs 27 (googleime, locale=en) (see also https://qiita.com/takaxp/items/e07bb286d80fa9dd8e05)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --exclude .git --exclude '*.o' --exclude .DS_Store --exclude '*TAGS' --exclude lib --exclude nextstep -crN emacs_orig/configure.ac emacs/configure.ac | |
*** emacs_orig/configure.ac 2019-12-27 03:23:17.000000000 +0900 | |
--- emacs/configure.ac 2019-12-27 03:24:01.000000000 +0900 | |
*************** | |
*** 2073,2079 **** | |
INSTALL_ARCH_INDEP_EXTRA= | |
fi | |
! NS_OBJC_OBJ="nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o $ns_fontfile" | |
fi | |
CFLAGS="$tmp_CFLAGS" | |
CPPFLAGS="$tmp_CPPFLAGS" | |
--- 2073,2079 ---- | |
INSTALL_ARCH_INDEP_EXTRA= | |
fi | |
! NS_OBJC_OBJ="nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o macim.o $ns_fontfile" | |
fi | |
CFLAGS="$tmp_CFLAGS" | |
CPPFLAGS="$tmp_CPPFLAGS" | |
*************** | |
*** 5471,5477 **** | |
darwin) | |
if test "$HAVE_NS" = "yes"; then | |
! libs_nsgui="-framework AppKit" | |
if test "$NS_IMPL_COCOA" = "yes"; then | |
libs_nsgui="$libs_nsgui -framework IOKit -framework Carbon" | |
fi | |
--- 5471,5477 ---- | |
darwin) | |
if test "$HAVE_NS" = "yes"; then | |
! libs_nsgui="-framework AppKit -framework Carbon" | |
if test "$NS_IMPL_COCOA" = "yes"; then | |
libs_nsgui="$libs_nsgui -framework IOKit -framework Carbon" | |
fi | |
diff --exclude .git --exclude '*.o' --exclude .DS_Store --exclude '*TAGS' --exclude lib --exclude nextstep -crN emacs_orig/lisp/term/common-win.el emacs/lisp/term/common-win.el | |
*** emacs_orig/lisp/term/common-win.el 2019-12-27 03:23:18.000000000 +0900 | |
--- emacs/lisp/term/common-win.el 2019-12-27 03:24:01.000000000 +0900 | |
*************** | |
*** 73,78 **** | |
--- 73,79 ---- | |
(cons 12 'ns-new-frame) | |
(cons 13 'ns-toggle-toolbar) | |
(cons 14 'ns-show-prefs) | |
+ (cons 15 'mac-change-input-method) | |
)))) | |
(set-terminal-parameter frame 'x-setup-function-keys t))) | |
diff --exclude .git --exclude '*.o' --exclude .DS_Store --exclude '*TAGS' --exclude lib --exclude nextstep -crN emacs_orig/lisp/term/ns-win.el emacs/lisp/term/ns-win.el | |
*** emacs_orig/lisp/term/ns-win.el 2019-12-27 03:23:18.000000000 +0900 | |
--- emacs/lisp/term/ns-win.el 2019-12-27 03:24:01.000000000 +0900 | |
*************** | |
*** 175,181 **** | |
(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. | |
--- 175,181 ---- | |
(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. | |
*************** | |
*** 269,282 **** | |
;; 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. | |
--- 269,298 ---- | |
;; 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. | |
*************** | |
*** 284,300 **** | |
(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 | |
--- 300,318 ---- | |
(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 | |
*************** | |
*** 303,311 **** | |
(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)) | |
(defun ns-insert-working-text () | |
"Insert contents of `ns-working-text' as UTF-8 string and mark with | |
--- 321,332 ---- | |
(defun ns-put-working-text () | |
(interactive) | |
(if (ns-in-echo-area) (ns-echo-working-text) (ns-insert-working-text))) | |
+ (defvar mac-ime-cursor-type nil) | |
(defun ns-unput-working-text () | |
(interactive) | |
! (ns-delete-working-text) | |
! (when mac-ime-cursor-type | |
! (setq cursor-type mac-ime-cursor-type))) | |
(defun ns-insert-working-text () | |
"Insert contents of `ns-working-text' as UTF-8 string and mark with | |
*************** | |
*** 591,598 **** | |
(interactive) | |
(modify-frame-parameters | |
frame (list (cons 'tool-bar-lines | |
! (if (> (or (frame-parameter frame 'tool-bar-lines) 0) 0) | |
! 0 1)) )) | |
(if (not tool-bar-mode) (tool-bar-mode t))) | |
--- 612,619 ---- | |
(interactive) | |
(modify-frame-parameters | |
frame (list (cons 'tool-bar-lines | |
! (if (> (or (frame-parameter frame 'tool-bar-lines) 0) 0) | |
! 0 1)) )) | |
(if (not tool-bar-mode) (tool-bar-mode t))) | |
*************** | |
*** 807,813 **** | |
;; Do the actual Nextstep Windows setup here; the above code just | |
;; defines functions and variables that we use now. | |
(cl-defmethod window-system-initialization (&context (window-system ns) | |
! &optional _display) | |
"Initialize Emacs for Nextstep (Cocoa / GNUstep) windowing." | |
(cl-assert (not ns-initialized)) | |
--- 828,834 ---- | |
;; Do the actual Nextstep Windows setup here; the above code just | |
;; defines functions and variables that we use now. | |
(cl-defmethod window-system-initialization (&context (window-system ns) | |
! &optional _display) | |
"Initialize Emacs for Nextstep (Cocoa / GNUstep) windowing." | |
(cl-assert (not ns-initialized)) | |
*************** | |
*** 846,855 **** | |
(dolist (service (ns-list-services)) | |
! (if (eq (car service) 'undefined) | |
! (ns-define-service (cdr service)) | |
! (define-key global-map (vector (car service)) | |
! (ns-define-service (cdr service))))) | |
(if (and (eq (get-lisp-resource nil "NXAutoLaunch") t) | |
(eq (get-lisp-resource nil "HideOnAutoLaunch") t)) | |
--- 867,876 ---- | |
(dolist (service (ns-list-services)) | |
! (if (eq (car service) 'undefined) | |
! (ns-define-service (cdr service)) | |
! (define-key global-map (vector (car service)) | |
! (ns-define-service (cdr service))))) | |
(if (and (eq (get-lisp-resource nil "NXAutoLaunch") t) | |
(eq (get-lisp-resource nil "HideOnAutoLaunch") t)) | |
*************** | |
*** 860,870 **** | |
;; For Darwin nothing except UTF-8 makes sense. | |
(when (eq system-type 'darwin) | |
! (add-hook 'before-init-hook | |
! #'(lambda () | |
! (setq locale-coding-system 'utf-8-unix) | |
! (setq default-process-coding-system | |
! '(utf-8-unix . utf-8-unix))))) | |
;; Mac OS X Lion introduces PressAndHold, which is unsupported by this port. | |
;; See this thread for more details: | |
--- 881,891 ---- | |
;; For Darwin nothing except UTF-8 makes sense. | |
(when (eq system-type 'darwin) | |
! (add-hook 'before-init-hook | |
! #'(lambda () | |
! (setq locale-coding-system 'utf-8-unix) | |
! (setq default-process-coding-system | |
! '(utf-8-unix . utf-8-unix))))) | |
;; Mac OS X Lion introduces PressAndHold, which is unsupported by this port. | |
;; See this thread for more details: | |
*************** | |
*** 893,899 **** | |
(declare-function ns-get-selection "nsselect.m" (selection-symbol target-type)) | |
(cl-defmethod gui-backend-set-selection (selection value | |
! &context (window-system ns)) | |
(if value (ns-own-selection-internal selection value) | |
(ns-disown-selection-internal selection))) | |
--- 914,920 ---- | |
(declare-function ns-get-selection "nsselect.m" (selection-symbol target-type)) | |
(cl-defmethod gui-backend-set-selection (selection value | |
! &context (window-system ns)) | |
(if value (ns-own-selection-internal selection value) | |
(ns-disown-selection-internal selection))) | |
*************** | |
*** 906,914 **** | |
(ns-selection-exists-p selection)) | |
(cl-defmethod gui-backend-get-selection (selection-symbol target-type | |
! &context (window-system ns)) | |
(ns-get-selection selection-symbol target-type)) | |
(provide 'ns-win) | |
(provide 'term/ns-win) | |
--- 927,1384 ---- | |
(ns-selection-exists-p selection)) | |
(cl-defmethod gui-backend-get-selection (selection-symbol target-type | |
! &context (window-system ns)) | |
(ns-get-selection selection-symbol target-type)) | |
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
+ ;; | |
+ ;; Implementation of Input Method Extension for MacOS X | |
+ ;; written by Taiichi Hashimoto <taiichi2@mac.com> | |
+ ;; | |
+ ;; Replace "MacOS X" with "macOS", by Takaaki Ishikawa <takaxp@ieee.org> | |
+ (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 macOS.") | |
+ | |
+ (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 macOS." | |
+ (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) | |
+ (when (member default-input-method '("MacOSX" "macOS")) | |
+ (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 "macOS")) | |
+ ((and (equal current-input-method "macOS") ascii-capable) | |
+ (toggle-input-method nil))) | |
+ (mac-input-method-update input-source)))) | |
+ | |
+ ;; | |
+ ;; Emacs input method for input method on macOS. | |
+ ;; | |
+ (register-input-method "macOS" "macOS" 'mac-toggle-input-method | |
+ "Mac" "Input Method on macOS System") | |
+ | |
+ ;; | |
+ ;; Minor mode of using input methods on macOS | |
+ ;; | |
+ (define-minor-mode mac-input-method-mode | |
+ "Use input methods on macOS." | |
+ :init-value nil | |
+ :group 'ns | |
+ :global t | |
+ (if mac-input-method-mode | |
+ (progn | |
+ (setq default-input-method "macOS") | |
+ (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 macOS.") | |
+ | |
+ (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 macOS. | |
+ ;; | |
+ (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) | |
(provide 'term/ns-win) | |
diff --exclude .git --exclude '*.o' --exclude .DS_Store --exclude '*TAGS' --exclude lib --exclude nextstep -crN emacs_orig/src/Makefile.in emacs/src/Makefile.in | |
*** emacs_orig/src/Makefile.in 2019-12-27 03:23:35.000000000 +0900 | |
--- emacs/src/Makefile.in 2019-12-27 03:24:01.000000000 +0900 | |
*************** | |
*** 433,439 **** | |
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 w32cygwinx.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 \ | |
--- 433,439 ---- | |
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 w32cygwinx.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 \ | |
diff --exclude .git --exclude '*.o' --exclude .DS_Store --exclude '*TAGS' --exclude lib --exclude nextstep -crN emacs_orig/src/macim.m emacs/src/macim.m | |
*** emacs_orig/src/macim.m 1970-01-01 09:00:00.000000000 +0900 | |
--- emacs/src/macim.m 2019-12-27 03:25:44.000000000 +0900 | |
*************** | |
*** 0 **** | |
--- 1,193 ---- | |
+ /* Implementation of Input Method Extension for macOS. | |
+ Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 | |
+ Taiichi Hashimoto <taiichi2@mac.com>. | |
+ | |
+ Replace "MacOSX" with "macOS", Takaaki Ishikawa <takaxp@ieee.org> | |
+ */ | |
+ | |
+ #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 macOS */) | |
+ (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 macOS */) | |
+ (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 macOS */) | |
+ (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]; | |
+ } | |
+ if ( [locale hasPrefix:@"ja"] ) { | |
+ is = TISCopyInputSourceForLanguage((CFStringRef)locale); | |
+ } else { | |
+ NSString *targetID = [NSString stringWithUTF8String:"com.google.inputmethod.Japanese.base"]; | |
+ if ( targetID == nil) { | |
+ return arg; | |
+ } | |
+ | |
+ NSArray *is_list = (NSArray *)TISCreateInputSourceList(NULL, false); | |
+ int list_size = [is_list count]; | |
+ for(int i=0; i< list_size; i++) { | |
+ NSString *id = (NSString *)TISGetInputSourceProperty((TISInputSourceRef)[is_list objectAtIndex:i], kTISPropertyInputSourceID); | |
+ if ( [id compare:targetID] == NSOrderedSame ) { | |
+ is = (TISInputSourceRef)[is_list objectAtIndex:i]; | |
+ break; | |
+ } | |
+ } | |
+ } | |
+ } | |
+ 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 | |
+ || strcmp(SDATA (dim), "macOS") == 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 == XFIXNUM (m)) | |
+ if (NILP (k) | |
+ || (NUMBERP (k) && code == XFIXNUM (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 --exclude .git --exclude '*.o' --exclude .DS_Store --exclude '*TAGS' --exclude lib --exclude nextstep -crN emacs_orig/src/nsfns.m emacs/src/nsfns.m | |
*** emacs_orig/src/nsfns.m 2019-12-27 03:23:35.000000000 +0900 | |
--- emacs/src/nsfns.m 2019-12-27 03:24:01.000000000 +0900 | |
*************** | |
*** 3172,3177 **** | |
--- 3172,3193 ---- | |
Default is t. */); | |
ns_use_proxy_icon = true; | |
+ DEFVAR_LISP ("ns-shift-key-mask", Vns_shift_key_mask, | |
+ doc: /* Shift key mask defined in system. */); | |
+ Vns_shift_key_mask = make_fixnum (NSShiftKeyMask); | |
+ | |
+ DEFVAR_LISP ("ns-control-key-mask", Vns_control_key_mask, | |
+ doc: /* Control key mask defined in system. */); | |
+ Vns_control_key_mask = make_fixnum (NSControlKeyMask); | |
+ | |
+ DEFVAR_LISP ("ns-alternate-key-mask", Vns_alternate_key_mask, | |
+ doc: /* Alternate key mask defined in system. */); | |
+ Vns_alternate_key_mask = make_fixnum (NSAlternateKeyMask); | |
+ | |
+ DEFVAR_LISP ("ns-command-key-mask", Vns_command_key_mask, | |
+ doc: /* Command key mask defined in system. */); | |
+ Vns_command_key_mask = make_fixnum (NSCommandKeyMask); | |
+ | |
defsubr (&Sns_read_file_name); | |
defsubr (&Sns_get_resource); | |
defsubr (&Sns_set_resource); | |
*************** | |
*** 3221,3226 **** | |
--- 3237,3246 ---- | |
defsubr (&Sx_show_tip); | |
defsubr (&Sx_hide_tip); | |
+ #ifdef NS_IMPL_COCOA | |
+ mac_init_input_method (); | |
+ #endif | |
+ | |
as_status = 0; | |
as_script = Qnil; | |
staticpro (&as_script); | |
diff --exclude .git --exclude '*.o' --exclude .DS_Store --exclude '*TAGS' --exclude lib --exclude nextstep -crN emacs_orig/src/nsterm.h emacs/src/nsterm.h | |
*** emacs_orig/src/nsterm.h 2019-12-27 03:23:35.000000000 +0900 | |
--- emacs/src/nsterm.h 2019-12-27 03:24:01.000000000 +0900 | |
*************** | |
*** 754,759 **** | |
--- 754,760 ---- | |
#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) | |
/* Could use list to store these, but rest of emacs has a big infrastructure | |
for managing a table of bitmap "records". */ | |
diff --exclude .git --exclude '*.o' --exclude .DS_Store --exclude '*TAGS' --exclude lib --exclude nextstep -crN emacs_orig/src/nsterm.m emacs/src/nsterm.m | |
*** emacs_orig/src/nsterm.m 2019-12-27 03:23:35.000000000 +0900 | |
--- emacs/src/nsterm.m 2019-12-27 03:24:01.000000000 +0900 | |
*************** | |
*** 5330,5335 **** | |
--- 5330,5339 ---- | |
selector: @selector (logNotification:) | |
name: nil object: nil]; */ | |
+ [[NSDistributedNotificationCenter defaultCenter] addObserver: NSApp | |
+ selector: @selector (changeInputMethod:) | |
+ name: @"AppleSelectedInputSourcesChangedNotification" object: nil]; | |
+ | |
dpyinfo = xzalloc (sizeof *dpyinfo); | |
ns_initialize_display_info (dpyinfo); | |
*************** | |
*** 5646,5651 **** | |
--- 5650,5670 ---- | |
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 | |
/* -------------------------------------------------------------------------- | |
*************** | |
*** 6371,6377 **** | |
/* If it was a function key or had control-like modifiers, pass | |
it directly to Emacs. */ | |
! if (fnKeysym || (emacs_event->modifiers | |
&& (emacs_event->modifiers != shift_modifier) | |
&& [[theEvent charactersIgnoringModifiers] length] > 0)) | |
{ | |
--- 6390,6397 ---- | |
/* If it was a function key or had control-like 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)) | |
{ | |
*************** | |
*** 6399,6407 **** | |
} | |
emacs_event->code = code; | |
! EV_TRAILER (theEvent); | |
! processingCompose = NO; | |
! return; | |
} | |
} | |
--- 6419,6437 ---- | |
} | |
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; | |
! } | |
} | |
} | |
*************** | |
*** 6591,6603 **** | |
{ | |
NSRect rect; | |
NSPoint pt; | |
! struct window *win = XWINDOW (FRAME_SELECTED_WINDOW (emacsframe)); | |
NSTRACE ("[EmacsView firstRectForCharacterRange:]"); | |
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); | |
--- 6621,6640 ---- | |
{ | |
NSRect rect; | |
NSPoint pt; | |
! struct window *win; | |
NSTRACE ("[EmacsView firstRectForCharacterRange:]"); | |
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); | |
*************** | |
*** 9609,9614 **** | |
--- 9646,9655 ---- | |
x_underline_at_descent_line = 0; | |
DEFSYM (Qx_underline_at_descent_line, "x-underline-at-descent-line"); | |
+ 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); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment