;;;
;;; Copyright (c) 2003,2004 uim Project http://uim.freedesktop.org/
;;;
;;; All rights reserved.
;;;
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
;;; are met:
;;; 1. Redistributions of source code must retain the above copyright
;;;    notice, this list of conditions and the following disclaimer.
;;; 2. Redistributions in binary form must reproduce the above copyright
;;;    notice, this list of conditions and the following disclaimer in the
;;;    documentation and/or other materials provided with the distribution.
;;; 3. Neither the name of authors nor the names of its contributors
;;;    may be used to endorse or promote products derived from this software
;;;    without specific prior written permission.
;;;
;;; THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
;;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
;;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
;;; ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
;;; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
;;; OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
;;; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
;;; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
;;; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
;;; SUCH DAMAGE.
;;;;

(require "generic.scm")

;; Hangul IMs requires some generic-keys disabled. See the post "A
;; question about the space bar" in uim@pdx.freedesktop.org
;; mailinglist from David Oftedal at Fri, 02 Apr 2004 22:55:25 +0200
(define hangul-proc-on-mode
  (let* ((non-existent-key? (make-single-key-predicate ""))
	 (generic-next-candidate-key? non-existent-key?)
	 (generic-prev-candidate-key? non-existent-key?)
	 (generic-commit-key?
	  (make-key-predicate '(" " generic-return-key?)))
	 (generic-proc-on-mode-with-this-env
	  (enclose-another-env generic-proc-on-mode (the-environment))))
    (lambda (id gc key state)  ;; "gc" stands for "generic-context"
      (generic-proc-on-mode-with-this-env id gc key state))))

;; 'let*' is required rather than 'let'
(define hangul-key-press-handler
  (let* ((generic-proc-on-mode hangul-proc-on-mode)
	 (generic-key-press-handler-with-this-env
	  (enclose-another-env generic-key-press-handler (the-environment))))
    (lambda (id key state)
      (generic-key-press-handler-with-this-env id key state))))

(define hangul-register-im
  (lambda (name lang code init)
    (register-im
     name lang code init generic-init-handler #f
     generic-mode-handler
     hangul-key-press-handler
     generic-key-release-handler
     generic-reset-handler
     generic-get-candidate-handler
     generic-set-candidate-index-handler
     generic-prop-handler
     )))
    
(define hangul2-init-handler
  (lambda (id arg)
    (require "hangul2.scm")
    (let* ((c (find-context id))
	   (cc (context-data c)))
      (set-context-data!
       c
       (generic-context-new hangul2-rule #t))
      #f)))

(define hangul3-init-handler
  (lambda (id arg)
    (require "hangul3.scm")
    (let* ((c (find-context id))
	   (cc (context-data c)))
      (set-context-data!
       c
       (generic-context-new hangul3-rule #t))
      #f)))

(define romaja-init-handler
  (lambda (id arg)
    (require "romaja.scm")
    (let* ((c (find-context id))
	   (cc (context-data c)))
      (set-context-data!
       c
       (generic-context-new romaja-rule #t))
      #f)))

(hangul-register-im
 'hangul2 "ko" "UTF-8" hangul2-init-handler)

;; hangul3 IM does not required generic-keys are disabled
(generic-register-im
 'hangul3 "ko" "UTF-8" hangul3-init-handler)

(hangul-register-im
 'romaja "ko" "UTF-8" romaja-init-handler)
