[uim-commit] r730 - trunk/scm

tkng at freedesktop.org tkng at freedesktop.org
Sat Feb 26 12:35:09 PST 2005


Author: tkng
Date: 2005-02-26 12:35:06 -0800 (Sat, 26 Feb 2005)
New Revision: 730

Modified:
   trunk/scm/latin.scm
Log:
* scm/latin.scm: Implement new key handling code, because old
   implementation is inadequate for latin input method.(latin doen't
   need on/off state and conversion candidate.)
   This new code must be improved, but it's better than before.



Modified: trunk/scm/latin.scm
===================================================================
--- trunk/scm/latin.scm	2005-02-26 16:43:13 UTC (rev 729)
+++ trunk/scm/latin.scm	2005-02-26 20:35:06 UTC (rev 730)
@@ -30,36 +30,42 @@
 
 ;; Charset of this file is UTF-8
 
+(require "util.scm")
+(require "rk.scm")
 (require "generic.scm")
 
+(define-key latin-backspace-key? '("backspace" "<Control>h"))
+(define-key latin-commit-key? "Return")
+
 (define latin-compose-rule '(
-((("\\" " " " " ))(" "))
-((("\\" " " "'" ))("'"))
-((("\\" " " "(" ))("˘"))
-((("\\" " " "-" ))("~"))
-((("\\" " " "<" ))("ˇ"))
-((("\\" " " ">" ))("^"))
-((("\\" " " "^" ))("^"))
-((("\\" " " "`" ))("`"))
-((("\\" " " "~" ))("~"))
-((("\\" "!" "!" ))("¡"))
-((("\\" "!" "P" ))("¶"))
-((("\\" "!" "S" ))("§"))
-((("\\" "!" "p" ))("¶"))
-((("\\" "!" "s" ))("§"))
-((("\\" "\"" "\"" ))("¨"))
-((("\\" "\"" "A" ))("Ä"))
-((("\\" "\"" "E" ))("Ë"))
-((("\\" "\"" "I" ))("Ï"))
-((("\\" "\"" "O" ))("Ö"))
-((("\\" "\"" "U" ))("Ü"))
-((("\\" "\"" "Y" ))("Ÿ"))
-((("\\" "\"" "a" ))("ä"))
-((("\\" "\"" "e" ))("ë"))
-((("\\" "\"" "i" ))("ï"))
-((("\\" "\"" "o" ))("ö"))
-((("\\" "\"" "u" ))("ü"))
-((("\\" "\"" "y" ))("ÿ"))
+((("\\" "\\"))("\\"))
+((("\\" " " " "))(" "))
+((("\\" " " "'"))("'"))
+((("\\" " " "("))("˘"))
+((("\\" " " "-"))("~"))
+((("\\" " " "<"))("ˇ"))
+((("\\" " " ">"))("^"))
+((("\\" " " "^"))("^"))
+((("\\" " " "`"))("`"))
+((("\\" " " "~"))("~"))
+((("\\" "!" "!"))("¡"))
+((("\\" "!" "P"))("¶"))
+((("\\" "!" "S"))("§"))
+((("\\" "!" "p"))("¶"))
+((("\\" "!" "s"))("§"))
+((("\\" "\"" "\""))("¨"))
+((("\\" "\"" "A"))("Ä"))
+((("\\" "\"" "E"))("Ë"))
+((("\\" "\"" "I"))("Ï"))
+((("\\" "\"" "O"))("Ö"))
+((("\\" "\"" "U"))("Ü"))
+((("\\" "\"" "Y"))("Ÿ"))
+((("\\" "\"" "a"))("ä"))
+((("\\" "\"" "e"))("ë"))
+((("\\" "\"" "i"))("ï"))
+((("\\" "\"" "o"))("ö"))
+((("\\" "\"" "u"))("ü"))
+((("\\" "\"" "y"))("ÿ"))
 ((("\\" "'" " " ))("'"))
 ((("\\" "'" "'" ))("´"))
 ((("\\" "'" "A" ))("Á"))
@@ -571,14 +577,234 @@
 
 (define latin-init-handler
   (lambda (id im arg)
-    (generic-context-new id im latin-im-rule #f)))
+    (latin-context-new id im)))
 
-(generic-register-im
+;; widgets and actions
+
+;; widgets
+(define latin-widgets '(widget_latin_input_mode))
+
+;; default activity for each widgets
+(define default-widget_latin_input_mode 'action_latin_off)
+
+;; actions of widget_latin_input_mode
+(define latin-input-mode-actions
+  '(action_latin_off
+    action_latin_on))
+
+
+;;; implementations
+
+(define ascii-rule
+  (map (compose (lambda (entry)
+		  (list (list entry) entry))
+		list
+		charcode->string)
+       (iota 127 32)))
+
+(define latin-prepare-activation
+  (lambda (gc)
+    (let ((rkc (latin-context-rk-context gc)))
+      (rk-flush rkc)
+      (latin-update-preedit gc))))
+
+(register-action 'action_latin_off
+		 (lambda (gc)
+		   (list
+		    'figure_latin_off
+		    "-"
+		    (N_ "off")
+		    (N_ "Direct Input Mode")))
+		 (lambda (gc)
+		   (not (latin-context-on gc)))
+		 (lambda (gc)
+		   (latin-prepare-activation gc)
+		   (latin-context-set-on! gc #f)))
+
+(register-action 'action_latin_on
+		 (lambda (gc)
+		   (let* ((im (latin-context-im gc))
+			  (name (symbol->string (im-name im))))
+		     (list
+		      'figure_latin_on
+		      "O"
+		      (N_ "on")
+		      (string-append name (N_ " Mode")))))
+		 (lambda (gc)
+		   (latin-context-on gc))
+		 (lambda (gc)
+		   (latin-prepare-activation gc)
+		   (latin-context-set-on! gc #t)))
+
+;; Update widget definitions based on action configurations. The
+;; procedure is needed for on-the-fly reconfiguration involving the
+;; custom API
+(define latin-configure-widgets
+  (lambda ()
+    (register-widget 'widget_latin_input_mode
+		     (activity-indicator-new latin-input-mode-actions)
+		     (actions-new latin-input-mode-actions))))
+
+(define latin-context-rec-spec
+  (append
+   context-rec-spec
+   '((rk-context         #f)
+     (rk-nth             0)
+     (on                 #t)
+     (candidate-op-count 0)
+     (raw-commit         #f)
+     (converting         #f))))
+(define-record 'latin-context latin-context-rec-spec)
+(define latin-context-new-internal latin-context-new)
+
+(define latin-context-new
+  (lambda (id im)
+    (let ((gc (latin-context-new-internal id im))
+	  (rkc (rk-context-new latin-im-rule #f #f)))
+      (latin-context-set-widgets! gc latin-widgets)
+      (latin-context-set-rk-context! gc rkc)
+      gc)))
+
+(define latin-context-flush
+  (lambda (pc)
+    (latin-context-set-rk-nth! pc 0)
+    (latin-context-set-candidate-op-count! pc 0)
+    (latin-context-set-converting! pc #f)))
+
+(define latin-update-preedit
+  (lambda (pc)
+    (let* ((rkc (latin-context-rk-context pc))
+	   (cs (rk-current-seq rkc))
+	   (n (latin-context-rk-nth pc)))
+      (im-clear-preedit pc)
+      (im-pushback-preedit
+       pc preedit-reverse
+       (if cs
+	   (nth n (cadr cs))
+	   (rk-pending rkc)))
+      (im-update-preedit pc))))
+
+(define latin-commit-raw
+  (lambda (pc)
+    (im-commit-raw pc)
+    (latin-context-set-raw-commit! pc #t)))
+
+(define latin-commit
+  (lambda (pc)
+    (let* ((rkc (latin-context-rk-context pc))
+	   (cs (rk-current-seq rkc)))
+      (if (> (length (cadr cs)) 0)
+	  (begin
+	    (im-commit pc (nth (latin-context-rk-nth pc) (cadr cs)))
+	    (im-deactivate-candidate-selector pc)
+	    (rk-flush rkc)
+	    (latin-context-flush pc))
+	  (begin
+	    (im-commit-raw pc)
+	    (rk-flush rkc)
+	    (im-update-preedit pc))))))
+
+(define latin-proc-input-state
+  (lambda (pc key state)
+    (let* ((rkc (latin-context-rk-context pc))
+	   (n (latin-context-rk-nth pc))
+	   (cs (cadr (rk-current-seq rkc)))
+	   (res))
+      (and
+       (if (latin-backspace-key? key state)
+	   (begin
+	     (if (not (rk-backspace rkc))
+		 (latin-commit-raw pc))
+	     (latin-context-set-rk-nth! pc 0)
+	     (im-deactivate-candidate-selector pc)
+	     #f)
+	   #t)
+       (if (latin-commit-key? key state)
+	   (begin
+	     (latin-commit pc)
+	     #f)
+	   #t)
+       (if (symbol? key)
+	   (begin
+	     (rk-flush rkc)
+	     (latin-commit-raw pc)
+	     (latin-context-flush pc)
+	     #f)
+	   #t)
+       (if (and (modifier-key-mask state)
+		(not (shift-key-mask state)))
+	   (begin
+	     (latin-commit-raw pc)
+	     #f)
+	   #t)
+       (begin
+	 (set! res
+	       (rk-push-key!
+		rkc
+		(charcode->string key)))
+	 #t))
+      (if (not (rk-partial? rkc))
+	  (let ((cs (rk-current-seq rkc)))
+	    (if (= (length (cadr cs)) 1)
+		(begin
+		  (im-commit pc
+			     (nth (latin-context-rk-nth pc) (cadr cs)))
+		  (latin-context-set-rk-nth! pc 0)
+		  (latin-context-set-candidate-op-count! pc 0)
+		  (im-deactivate-candidate-selector pc)
+		  (rk-flush rkc)))))
+      (if res
+	  (begin
+	    (im-commit pc (nth (latin-context-rk-nth pc) res))
+	    (latin-context-set-rk-nth! pc 0)
+	    (latin-context-set-candidate-op-count! pc 0)
+	    (im-deactivate-candidate-selector pc))
+	  ))))
+
+(define latin-press-key-handler
+  (lambda (pc key state)
+    (if (control-char? key)
+	(im-commit-raw pc)
+	(latin-proc-input-state pc key state))
+    (latin-update-preedit pc)
+    ()))
+
+(define latin-release-key-handler
+  (lambda (pc key state)
+    (if (or (control-char? key)
+	    (not (latin-context-on pc)))
+	;; don't discard key release event for apps
+	(latin-commit-raw pc))))
+
+(define latin-reset-handler
+  (lambda (pc)
+    (let ((rkc (latin-context-rk-context pc)))
+      (rk-flush rkc))))
+
+(define latin-get-candidate-handler
+  (lambda (pc idx accel-enum-hint)
+    ()))
+
+(define latin-set-candidate-index-handler
+  (lambda (pc idx)
+    ()))
+
+(latin-configure-widgets)
+
+(register-im
  'latin
  ""
  "UTF-8"
- ;; I think that the name "euro" is not appropriate since it
- ;; represents nation or geographic region.  -- YamaKen 2005-01-29
  (N_ "Latin characters")
  (N_ "Latin characters mainly used for Latin and German languages")
- latin-init-handler)
+ #f
+ latin-init-handler
+ #f
+ context-mode-handler
+ latin-press-key-handler
+ latin-release-key-handler
+ latin-reset-handler
+ #f
+ #f
+ context-prop-activate-handler
+)



More information about the Uim-commit mailing list