Commit 3fd30cf94fc4bf972cff719b565f75730488cade

  • avatar
  • egaudet
  • Mon Sep 28 04:12:19 CEST 2009
Removed obsolete keyboard files
  
1diff --git a/usr/palm/frameworks/mojo/builtins/palmInitFramework191_15.js b/usr/palm/frameworks/mojo/builtins/palmInitFramework191_15.js
2index 4307893..ff5ea6f 100644
3--- a/usr/palm/frameworks/mojo/builtins/palmInitFramework191_15.js
4+++ b/usr/palm/frameworks/mojo/builtins/palmInitFramework191_15.js
5@@ -674,6 +674,7 @@ _Dialog:'widget_dialog',
6 Pager:null,
7 Drawer:null,
8 CharSelector:null,
9+VirtualKeyboard:null,
10 FilterList:null,
11 _Submenu:'widget_submenu',
12 ExperimentalGridList:'widget_grid',
13@@ -3717,6 +3718,11 @@ if(this.charSelector&&this.charSelector.element&&this.charSelector.element.mojo&
14 return;
15 }
16 this.charSelector=this.createDynamicWidget('CharSelector',{selectionTarget:event.selectionTarget});
17+}else if(event.type===Mojo.Event.renderVirtualKeyboard){
18+if(this.virtualKeyboard&&this.virtualKeyboard.element&&this.virtualKeyboard.element.mojo&&this.virtualKeyboard.element.mojo.isOpen()){
19+return;
20+}
21+this.virtualKeyboard=this.createDynamicWidget('VirtualKeyboard',{selectionTarget:event.selectionTarget});
22 }
23 },
24
25@@ -3996,6 +4002,7 @@ kDefaultSceneName:'main',
26 kSceneClassName:'palm-scene',
27 kBrowserObject:'application/x-palm-browser',
28 enableAltCharPicker:true,
29+enableVirtualKeyboard:true,
30
31
32
33@@ -4008,6 +4015,7 @@ this.document=this.window.document;
34 this.paramsFromURI=this.document.baseURI.toQueryParams();
35 this.stageType=this.paramsFromURI.window||"card";
36 this._stageProxy=stageProxy;
37+this.metaCount=0;
38
39 this._stagePreparing=true;
40
41@@ -4871,6 +4879,13 @@ var scene=this.topScene();
42 var tempTextArea,msg,scriptNode;
43 var webView;
44
45+/* Use pageup (179) for emulator */
46+if (event.keyCode === Mojo.Char.metaKey || event.keyCode === 179) {
47+ if (this.metaCount === 2) {
48+ this.metaDoubleTap=true;
49+ }
50+}
51+
52 if(Mojo.Controller.isGoBackKey(event)){
53 var newEv=Mojo.Event.make(Mojo.Event.back,{originalEvent:event});
54 this.sendEventToCommanders(newEv);
55@@ -4891,6 +4906,16 @@ if(webView){
56 webView.mojo.isEditing(this._sendCharpickerEventCallback.bind(this,Mojo.Event.renderAltCharacters,webView,null));
57 }
58 }
59+}else if(this.enableVirtualKeyboard&&this.metaDoubleTap){
60+this.metaDoubleTap=false;
61+if(this.doesTargetAcceptKeys(event.target)){
62+this._sendCharpickerEvent(Mojo.Event.renderVirtualKeyboard,event.target,null);
63+}else{
64+webView=this._getWebview(event.target);
65+if(webView){
66+webView.mojo.isEditing(this._sendCharpickerEventCallback.bind(this,Mojo.Event.renderVirtualKeyboard,webView,null));
67+}
68+}
69 }else if(event.keyCode===Mojo.Char.o&&event.ctrlKey&&event.shiftKey&&Mojo.Config.debuggingEnabled){
70
71
72@@ -4933,8 +4958,6 @@ tempTextArea.remove();
73 }else{
74
75
76-
77-
78 scene=this.activeScene();
79 if(event.metaKey&&scene&&scene.handleShortcut(String.fromCharCode(event.which),event)){
80 Event.stop(event);
81@@ -4949,6 +4972,13 @@ this._forwardEventToTopContainer(Mojo.Event.keyup,event);
82 _keyDownHandler:function(event){
83 var webView;
84
85+if (event.keyCode === Mojo.Char.metaKey || event.keyCode === 179) {
86+ this.metaCount++;
87+ if (this.metaCount === 1) {
88+ this.metaTimer=this.window.setTimeout(function(){this.metaCount=0;}.bind(this), 600);
89+ }
90+}
91+
92 if(this.enableAltCharPicker&&event.keyCode!==Mojo.Char.opt&&event.ctrlKey){
93 if(this.doesTargetAcceptKeys(event.target)){
94 this._sendCharpickerEvent(Mojo.Event.renderChordedAltCharacters,event.target,event.keyCode);
95@@ -9431,6 +9461,9 @@ Mojo.Event.renderAltCharacters='mojo-altchars';
96 Mojo.Event.renderChordedAltCharacters='mojo-altchars-chorded';
97
98
99+Mojo.Event.renderVirtualKeyboard='webos-internals-onscreen-keyboard';
100+
101+
102 Mojo.Event.orientationChange='mojo-orientation';
103
104
105@@ -10619,7 +10652,7 @@ return stringTable;
106
107 Mojo.Locale.set=function(currentLocale,formatRegion){
108 var deviceInfo=Mojo.Environment.DeviceInfo;
109-var altCharFullTable,altCharTable;
110+var altCharFullTable,altCharTable,kbCharTable,kbCharFullTable;
111
112 if(Mojo.Locale.current!=currentLocale){
113 Mojo.Locale.current=currentLocale;
114@@ -10660,13 +10693,21 @@ Mojo.Locale.frameworkStrings=Mojo.Locale.readStringTable("strings.json",Mojo.Loc
115 if(deviceInfo.keyboardType===Mojo.Environment.AZERTY){
116 altCharTable="alternatechars_table_azerty.json";
117 altCharFullTable="alternatechars_fulltable_azerty.json";
118+kbCharTable="kbchars_table_azerty.json";
119+kbCharFullTable="kbchars_fulltable_azerty.json";
120 }else if(deviceInfo.keyboardType===Mojo.Environment.QWERTZ){
121 altCharTable="alternatechars_table_qwertz.json";
122 altCharFullTable="alternatechars_fulltable_qwertz.json";
123+kbCharTable="kbchars_table_qwertz.json";
124+kbCharFullTable="kbchars_fulltable_qwertz.json";
125 }else{
126 altCharTable="alternatechars_table.json";
127 altCharFullTable="alternatechars_fulltable.json";
128+kbCharTable="kbchars_table.json";
129+kbCharFullTable="kbchars_fulltable.json";
130 }
131+Mojo.Locale.kbCharacters=Mojo.Locale.readStringTable(kbCharTable,Mojo.Locale.current,Mojo.Locale.frameworkResourcePath,altCharArrayMerge);
132+Mojo.Locale.kbCharactersFull=Mojo.Locale.readStringTable(kbCharFullTable,Mojo.Locale.current,Mojo.Locale.frameworkResourcePath,altCharArrayMerge);
133 Mojo.Locale.alternateCharacters=Mojo.Locale.readStringTable(altCharTable,Mojo.Locale.current,Mojo.Locale.frameworkResourcePath,altCharArrayMerge);
134 Mojo.Locale.alternateCharactersFull=Mojo.Locale.readStringTable(altCharFullTable,Mojo.Locale.current,Mojo.Locale.frameworkResourcePath,altCharArrayMerge);
135 Mojo.Locale.DateTimeStrings=Mojo.Locale.readStringTable("datetime_table.json",Mojo.Locale.current,Mojo.Locale.frameworkResourcePath);
136@@ -19131,6 +19172,9 @@ handleMouseEvent:function(event){
137 if(event.target&&Mojo.View.getParentWithAttribute(event.target,"x-mojo-element","CharSelector")){
138 return;
139 }
140+if(event.target&&Mojo.View.getParentWithAttribute(event.target,"x-mojo-element","VirtualKeyboard")){
141+return;
142+}
143
144 switch(this.STATE){
145 case this.ADDRESSING_WIDGET_UNFOCUSED:
146@@ -28599,7 +28643,8 @@ return false;
147
148 sendChanges:function(triggeringEvent){
149
150-if(!Mojo.View.getParentWithAttribute(triggeringEvent.target,'x-mojo-element','CharSelector')){
151+if(!Mojo.View.getParentWithAttribute(triggeringEvent.target,'x-mojo-element','CharSelector') &&
152+ !Mojo.View.getParentWithAttribute(triggeringEvent.target,'x-mojo-element','VirtualKeyboard')){
153 this.maybeSendPropertyChangeEvent(triggeringEvent);
154 }
155 },
156@@ -34320,6 +34365,1068 @@ return true;
157 }
158 return false;
159 };
160+
161+/* oskb */
162+Mojo.Widget.VirtualKeyboard=Class.create({
163+
164+HI_PADDING_TOP:40,
165+
166+HI_PADDING_BOTTOM:20,
167+
168+HI_PADDING_LEFT:20,
169+
170+HI_PADDING_RIGHT:20,
171+
172+HI_COLUMNS:10,
173+
174+HI_MINIMUM_TOP:10,
175+
176+HI_MAX_BOTTOM:5,
177+
178+/* oskb */
179+initialize:function(){
180+this.VIRT_KB_MEDIA_PATH='/media/internal/virtual-keyboard/';
181+this.VIRT_KB_THEMES_PATH=this.VIRT_KB_MEDIA_PATH + 'themes/';
182+this.VIRT_KB_SOUNDS_PATH=this.VIRT_KB_MEDIA_PATH + 'sounds/';
183+this.VIRT_KB_OPEN=0;
184+this.VIRT_KB_FILTERING_STATE=1;
185+this.VIRT_KB_CLOSED=2;
186+this.VIRT_KB_EMPTY=3;
187+
188+this.SHIFT_OFF=0;
189+this.SHIFT_ONCE=1;
190+this.SHIFT_LOCK=2;
191+
192+this.FUNC_OFF=0;
193+this.FUNC_ONCE=1;
194+this.FUNC_LOCK=2;
195+
196+this.state=this.VIRT_KB_OPEN;
197+this.shiftState=this.SHIFT_OFF;
198+this.funcState=this.FUNC_OFF;
199+
200+this.dragEnabled=false;
201+this.scrollEnabled=false;
202+this.customStyle=undefined;
203+this.templateSuffix="";
204+this.layout="portrait";
205+this.textCase="lowercase";
206+this.charList=[];
207+this.localizedTable=Mojo.Locale.kbCharacters;
208+this.localizedTableFull=Mojo.Locale.kbCharactersFull;
209+},
210+
211+
212+/* oskb */
213+setup:function(){
214+var model=this.controller.model;
215+
216+var options = Mojo.parseJSON(palmGetResource(this.VIRT_KB_MEDIA_PATH + '/kb_config.json'));
217+
218+if (options) {
219+ this.theme=options.theme;
220+ this.haptic=options.haptic;
221+ this.clickFile=options.clickFile;
222+}
223+
224+this.controller.exposeMethods(['close','isOpen']);
225+if(this.controller.attributes.target){
226+this.target=this.controller.get(this.controller.attributes.target);
227+}else if(model.selectionTarget){
228+this.target=this.controller.get(model.selectionTarget);
229+}
230+this.divPrefix=Mojo.View.makeUniqueId();
231+this.currCode=this.controller.model.character;
232+if(this.currCode!==undefined){
233+this.chorded=true;
234+}
235+
236+if(this.renderWidget(this.controller.model.character)){
237+this.handleMouseOver=this.handleMouseOver.bindAsEventListener(this);
238+this.handleMouseUp=this.handleMouseUp.bindAsEventListener(this);
239+this.handleMouseDown=this.handleMouseDown.bindAsEventListener(this);
240+this.handleDragStart=this.handleDragStart.bindAsEventListener(this);
241+this.handleDragEnd=this.handleDragEnd.bindAsEventListener(this);
242+this.handleDragging=this.handleDragging.bindAsEventListener(this);
243+this.handleKeyEvent=this.handleKeyEvent.bind(this);
244+this.handleKeyUpEvent=this.handleKeyUpEvent.bind(this);
245+this.handleTapEvent=this.handleTapEvent.bind(this);
246+this.handleOrientation=this.handleOrientation.bindAsEventListener(this);
247+this.controller.listen(this.target,"keydown",this.handleKeyEvent,true);
248+this.controller.listen(this.target,"keyup",this.handleKeyUpEvent,true);
249+this.controller.listen(this.controller.document,Mojo.Event.orientationChange,this.handleOrientation,true);
250+this.controller.listen(this.controller.document,Mojo.Event.dragStart,this.handleDragStart,true);
251+this.controller.listen(this.controller.document,Mojo.Event.dragEnd,this.handleDragEnd,true);
252+this.controller.listen(this.controller.document,Mojo.Event.dragging,this.handleDragging,true);
253+this.controller.listen(this.controller.document,'mouseover',this.handleMouseOver,true);
254+this.controller.listen(this.controller.document,'mouseup',this.handleMouseUp,true);
255+this.controller.listen(this.controller.document,'mousedown',this.handleMouseDown,true);
256+this.controller.listen(this.controller.document,Mojo.Event.tap,this.handleTapEvent,true);
257+
258+if(this.chorded){
259+
260+this.state=this.VIRT_KB_FILTERING_STATE;
261+}else{
262+this.enterOpenState();
263+}
264+this.controller.scene.pushContainer(this.controller.element,this.controller.scene.submenuContainerLayer,
265+{cancelFunc:this._emptyAndClose.bind(this)});
266+this.controller.scene.pushCommander(this);
267+}
268+},
269+
270+
271+/* oskb */
272+cleanup:function(){
273+
274+
275+this.charPicker=undefined;
276+this.selectedIndex=undefined;
277+this.state=this.VIRT_KB_CLOSED;
278+this.cleanupEventListeners();
279+},
280+
281+
282+
283+
284+
285+/* oskb */
286+cleanupEventListeners:function(){
287+this.controller.stopListening(this.target,"keydown",this.handleKeyEvent,true);
288+this.controller.stopListening(this.target,"keyup",this.handleKeyUpEvent,true);
289+this.controller.stopListening(this.controller.document,Mojo.Event.orientationChange,this.handleOrientation,true);
290+this.controller.stopListening(this.controller.document,Mojo.Event.dragStart,this.handleDragStart,true);
291+this.controller.stopListening(this.controller.document,Mojo.Event.dragEnd,this.handleDragEnd,true);
292+this.controller.stopListening(this.controller.document,Mojo.Event.dragging,this.handleDragging,true);
293+this.controller.stopListening(this.controller.document,'mouseover',this.handleMouseOver,true);
294+this.controller.stopListening(this.controller.document,'mouseup',this.handleMouseUp,true);
295+this.controller.stopListening(this.controller.document,'mousedown',this.handleMouseDown,true);
296+this.controller.stopListening(this.controller.document,Mojo.Event.tap,this.handleTapEvent,true);
297+},
298+
299+
300+/* oskb */
301+loadTable:function(chr){
302+var data,list;
303+var i=0;
304+var that=this;
305+var table;
306+var letter;
307+var alt;
308+var span;
309+
310+this.charList=[];
311+table=this.localizedTableFull;
312+
313+table.each(function(c){
314+/* TODO: get rid of list idea that doesn't need to exist for kb */
315+ list = c.list;
316+ letter = c.letter;
317+ alt = c.alt;
318+ span = c.span;
319+ if(list){
320+ list.each(function(item){
321+ data={
322+ index:i,
323+ character:item,
324+ letter:letter,
325+ alt:alt,
326+ span:span,
327+ keyCode:c.keyCode
328+ };
329+
330+ that.charList.push(data);
331+ i++;
332+ });
333+ }
334+ list=undefined;
335+});
336+
337+if (this.theme !== "default") {
338+ var themeTable = palmGetResource(this.VIRT_KB_THEMES_PATH + this.theme + '/theme_config.json');
339+ if (themeTable) {
340+ var themeObject = Mojo.parseJSON(themeTable);
341+ var idx;
342+ var img;
343+ var c;
344+ var span;
345+ var bg;
346+ var class;
347+ themeObject.each(function(t){
348+ idx=t.index;
349+ img=t.image;
350+ c=t.character;
351+ span=t.span;
352+ class=t.class;
353+ if ((idx>=0) && (idx<that.charList.length)) {
354+ if (c) {
355+ that.charList[idx].character=c;
356+ if (img) {
357+ that.charList[idx].character="<img name='" + idx + "' class='kb-img' src='"+that.VIRT_KB_THEMES_PATH + that.theme + "/" + img + "' alt='" + c + "'>";
358+ }
359+ if (span) {
360+ that.charList[idx].span = span;
361+ }
362+ }
363+ }
364+ if (!this.customStyle&&class) {
365+ that.customStyle = t;
366+ }
367+ });
368+ }
369+}
370+},
371+
372+/* oskb */
373+_setPopupPositions:function(picker){
374+var top='';
375+var cursorPos=Mojo.View.getCursorPosition(this.controller.window);
376+var viewDims=Mojo.View.getViewportDimensions(this.controller.document);
377+var pickerDims=Mojo.View.getDimensions(picker);
378+var targetOffset=Mojo.View.viewportOffset(this.target);
379+
380+/*
381+console.log("char picker dims = " + Object.toJSON(Mojo.View.getDimensions(this.charPicker)));
382+console.log("target dims = " + Object.toJSON(Mojo.View.getDimensions(this.target)));
383+console.log("target style " + this.target.style);
384+console.log("target top " + this.target.style.top);
385+console.log("target offsettop " + this.target.offsetTop);
386+console.log("viewport offset " + Object.toJSON(Mojo.View.viewportOffset(this.target)));
387+
388+console.log("cursor pos = " + cursorPos.x + ", " + cursorPos.y);
389+console.log("viewDims = " + viewDims.width + " X " + viewDims.height);
390+console.log("pickerDimes = " + pickerDims.width + " X " + pickerDims.height);
391+console.log("pickerDims = " + Object.toJSON(pickerDims));
392+*/
393+
394+this.maxVert = top = viewDims.height - pickerDims.height;
395+if (targetOffset && (targetOffset.top >= top) && (targetOffset.top >= pickerDims.height)) {
396+ top=targetOffset.top - pickerDims.height;
397+}
398+else if (cursorPos && (cursorPos.y >= top) && (cursorPos.y >= pickerDims.height)) {
399+ top=cursorPos.y - pickerDims.height;
400+}
401+top+='px';
402+
403+console.log("EG: set top " + top);
404+picker.setStyle({'top':top,'left':'0px'});
405+},
406+
407+
408+/* oskb */
409+translateToRow:function(results){
410+
411+var finished=false;
412+var result;
413+var newOffset=0;
414+var transformedResults=[];
415+
416+while(!finished){
417+result={};
418+
419+
420+result.characters=Mojo.View.render({collection:results.slice(newOffset,newOffset+this.HI_COLUMNS),attributes:{divPrefix:this.divPrefix},template:this.itemTemplate});
421+newOffset+=this.HI_COLUMNS;
422+transformedResults.push(result);
423+if(newOffset>=results.length){
424+finished=true;
425+}
426+}
427+return transformedResults;
428+},
429+
430+
431+ /* oskb */
432+renderWidget:function(chr){
433+var data;
434+var charContent;
435+var charContentModel;
436+var pickerContent;
437+var parent;
438+
439+this.loadTable(chr);
440+if(this.charList&&this.charList.length>0){
441+
442+charContentModel={
443+divPrefix:this.divPrefix
444+};
445+
446+this.templateSuffix = "";
447+this.layout="portrait";
448+
449+if (this.controller.stageController) {
450+ var orientation = this.controller.stageController.getWindowOrientation();
451+ if (orientation === "left" || orientation === "right") {
452+ this.templateSuffix = '-ls';
453+ this.layout="landscape";
454+ }
455+}
456+
457+this.itemTemplate=Mojo.Widget.getSystemTemplatePath('/kbselector/char'+this.templateSuffix),
458+this.itemsModel={items:this.translateToRow(this.charList)};
459+this.charPicker=undefined;
460+pickerContent=Mojo.View.render({object:charContentModel,template:Mojo.Widget.getSystemTemplatePath('/kbselector/charselector'+this.templateSuffix)});
461+
462+/* NOTE: Our parent must be the scene element in order to use the
463+ * Dragger class, with our own drop container so as to not
464+ * disrupt the scene's other drop containers.
465+parent=Mojo.View.getScrollerForElement(this.target);
466+if(!parent){
467+parent=this.controller.scene.sceneElement;
468+}
469+*/
470+parent=this.controller.scene.sceneElement;
471+if(this.controller.element.parentNode!==parent){
472+this.controller.reparent(parent);
473+}
474+this.controller.element.innerHTML=pickerContent;
475+/* If we are not set to scroll (i.e. symbol button not pressed), remove
476+ * the scroller widget before instantiating */
477+if (!this.scrollEnabled) {
478+ this.controller.get(this.divPrefix+"-char-selector").removeAttribute("x-mojo-element");
479+}
480+
481+this.charPicker=this.controller.get(this.divPrefix+'-kb-char-selector-div');
482+this.keyboard=this.controller.get(this.divPrefix+'-char-selector');
483+
484+if (this.customStyle) {
485+ this.charPicker.setStyle(this.customStyle);
486+}
487+
488+this.controller.scene.setupWidget('char-list',
489+{itemTemplate:Mojo.Widget.getSystemTemplatePath('kbselector/char-selector-row'+this.templateSuffix),renderLimit:30},this.itemsModel);
490+this.controller.instantiateChildWidgets(this.charPicker);
491+/* Adjust the width based on the span number */
492+for (var i=0; i<40; i++) {
493+ if (this.charList[i].span) {
494+ var newWidth = this.charList[i].span * 10 + "%";
495+ this._getMatching(this.charPicker,i).setStyle({"width":newWidth});
496+ }
497+}
498+this.controller.scene.showWidgetContainer(this.charPicker);
499+this._setPopupPositions(this.charPicker);
500+
501+this.funcDiv=this.controller.get(this.divPrefix+"-20");
502+this.shiftDiv=this.controller.get(this.divPrefix+"-31");
503+this.symDiv=this.controller.get(this.divPrefix+"-35");
504+this.blankDivLeft=this.controller.get(this.divPrefix+"-30");
505+this.blankDivRight=this.controller.get(this.divPrefix+"-36");
506+this.selectedIndex=0;
507+/*
508+this._updateSelected(null,this._selectedIdxElem());
509+*/
510+if(this._selectedIdxElem()){
511+this.perLine=Math.floor(Element.getWidth(this.charPicker)/Element.getWidth(this._selectedIdxElem()));
512+}else{
513+this.perLine=0;
514+}
515+return true;
516+}else{
517+if(!this.chorded){
518+this.exitSelector();
519+return false;
520+}else{
521+return true;
522+}
523+}
524+},
525+
526+
527+/* oskb */
528+enterOpenState:function(){
529+
530+this.state=this.VIRT_KB_OPEN;
531+},
532+
533+
534+/* oskb */
535+_maybeRemoveCharpicker:function(){
536+if(this.charPicker){
537+if(this.charPicker.parentNode){
538+Element.remove(this.charPicker);
539+}
540+this.charPicker=undefined;
541+}
542+},
543+
544+
545+/* oskb */
546+enterFilteringState:function(keyCode){
547+
548+this.state=this.VIRT_KB_FILTERING_STATE;
549+
550+if(this.currCode!==keyCode){
551+this.currCode=keyCode;
552+
553+this._maybeRemoveCharpicker();
554+this.renderWidget(this.currCode);
555+}else{
556+
557+this.advance();
558+}
559+},
560+
561+
562+/* oskb */
563+handleModelChanged:function(model,what){
564+Element.show(this.charPicker);
565+if(Mojo.Char.isValid(this.controller.model.character)){
566+this.enterFilteringState(this.controller.model.character);
567+}
568+},
569+
570+
571+/* oskb */
572+_emptyAndClose:function(){
573+this.state=this.VIRT_KB_EMPTY;
574+this.close();
575+},
576+
577+
578+/* oskb */
579+close:function(){
580+
581+if(this.state===this.VIRT_KB_FILTERING_STATE||this.state===this.VIRT_KB_OPEN){
582+this.exitSelector(this.getEntered());
583+return;
584+}
585+
586+this._safeRemove();
587+},
588+
589+
590+/* oskb */
591+isOpen:function(){
592+return this.state!==this.VIRT_KB_CLOSED;
593+},
594+
595+/* oskb */
596+isSpecialChar:function(keyCode){
597+ return(Mojo.Char.isEnterKey(keyCode));
598+},
599+
600+/* oskb */
601+isSupported:function(keyCode){
602+ return(keyCode);
603+},
604+
605+/* oskb */
606+updateText:function(){
607+ for (var i=0; i<28; i++) {
608+ this.controller.get(this.divPrefix+"-"+i).setStyle({"text-transform":this.textCase});
609+ switch(this.textCase) {
610+ case 'uppercase':
611+ this.charList[i].letter = this.charList[i].letter.toUpperCase();
612+ break;
613+ case 'lowercase':
614+ this.charList[i].letter = this.charList[i].letter.toLowerCase();
615+ break;
616+ }
617+ }
618+},
619+
620+/* oskb */
621+handleShift:function(){
622+if (this.shiftState === this.SHIFT_OFF) {
623+ this.shiftState = this.SHIFT_ONCE;
624+ this.shiftDiv.addClassName("kb-active-char");
625+ this.textCase = "uppercase";
626+}
627+else if (this.shiftState === this.SHIFT_ONCE) {
628+ this.shiftState = this.SHIFT_LOCK;
629+ this.shiftDiv.addClassName("locked");
630+ return;
631+}
632+else {
633+ this.shiftState = this.SHIFT_OFF;
634+ this.textCase = "lowercase";
635+ this.shiftDiv.removeClassName("kb-active-char");
636+ this.shiftDiv.removeClassName("locked");
637+}
638+
639+this.updateText();
640+},
641+
642+/* oskb */
643+handleFunc:function(){
644+/* TODO: Update the keys on screen when using text (default theme) */
645+if (this.funcState === this.FUNC_OFF) {
646+ this.funcState = this.FUNC_ONCE;
647+ this.funcDiv.addClassName("kb-active-char");
648+ this.useAltChars = true;
649+}
650+else if (this.funcState === this.FUNC_ONCE) {
651+ this.funcState = this.FUNC_LOCK;
652+ this.funcDiv.addClassName("locked");
653+ return;
654+}
655+else {
656+ this.funcState = this.FUNC_OFF;
657+ this.useAltChars = false;
658+ this.funcDiv.removeClassName("kb-active-char");
659+ this.funcDiv.removeClassName("locked");
660+}
661+},
662+
663+/* oskb */
664+exitSelector:function(chr){
665+var letter;
666+var characterVal,selection;
667+var tagName=this.target.tagName;
668+var selectionStart,selectionEnd;
669+var isWebView=false;
670+
671+if(this.target.mojo&&this.target.mojo.insertStringAtCursor){
672+isWebView=true;
673+}
674+
675+if(chr){
676+letter=chr.letter || chr.character || " ";
677+
678+if (this.useAltChars && chr.alt) {
679+ letter = chr.alt;
680+}
681+
682+selection=this.controller.window.getSelection();
683+
684+if (chr.keyCode === 0 && !this.scrollEnabled) {
685+ this.dragEnabled = true;
686+ this.blankDivLeft.addClassName("kb-active-char locked");
687+ this.blankDivRight.addClassName("kb-active-char locked");
688+ return;
689+}
690+else if (Mojo.Char.isDeleteKey(chr.keyCode)) {
691+ this.controller.document.execCommand("Delete");
692+}
693+else if (chr.keyCode === Mojo.Char.altKey) {
694+ if (this.shiftState === this.SHIFT_LOCK) {
695+ this.handleShift();
696+ }
697+ this.handleFunc();
698+}
699+else if (chr.keyCode === Mojo.Char.shift) {
700+ if (this.funcState === this.FUNC_LOCK) {
701+ this.handleFunc();
702+ }
703+ this.handleShift();
704+}
705+else if (this.isSymKey(chr.keyCode)) {
706+ /* TODO: is this really the only way to dynamically start/stop scrolling? */
707+ this.scrollEnabled = !this.scrollEnabled;
708+ this.renderWidget();
709+ if (this.scrollEnabled) {
710+ this.symDiv.addClassName("kb-active-char locked");
711+ }
712+ else {
713+ this.symDiv.removeClassName("kb-active-char locked");
714+ }
715+
716+ return;
717+}
718+else if (!this.isSupported(chr.keyCode)) {
719+ console.log("Char keycode " + chr.keyCode + " not supported (yet)");
720+ return;
721+}
722+else if(selection&&selection.rangeCount>0&&selection.getRangeAt(0)){
723+this.controller.document.execCommand("insertText",true,letter);
724+}else if(isWebView&&letter!==null&&letter!==undefined){
725+this.target.mojo.insertStringAtCursor(letter);
726+}
727+
728+
729+if (this.isSpecialChar(chr.keyCode)) {
730+ Mojo.Event.send(this.target,'keydown',{keyCode:chr.keyCode});
731+ Mojo.Event.send(this.target,'keyup',{keyCode:chr.keyCode});
732+}
733+
734+if(this.target.mojo&&this.target.mojo.setText){
735+selectionStart=this.target.selectionStart;
736+selectionEnd=this.target.selectionEnd;
737+this.target.mojo.setText(this.target.value);
738+this.target.selectionStart=selectionStart;
739+this.target.selectionEnd=selectionEnd;
740+}
741+
742+
743+}else{
744+this.cleanupEventListeners();
745+this._safeRemove();
746+this.state=this.VIRT_KB_CLOSED;
747+}
748+
749+if(!isWebView){
750+this.target.focus();
751+}
752+
753+if (chr && this.shiftState === this.SHIFT_ONCE && chr.keyCode !== Mojo.Char.shift){
754+ this.shiftState = this.SHIFT_OFF;
755+ this.shiftDiv.removeClassName("locked");
756+ this.shiftDiv.removeClassName("kb-active-char");
757+ this.textCase = "lowercase";
758+ this.updateText();
759+}
760+if (chr && this.funcState === this.FUNC_ONCE && chr.keyCode !== Mojo.Char.altKey){
761+ this.funcState = this.FUNC_OFF;
762+ this.funcDiv.removeClassName("locked");
763+ this.funcDiv.removeClassName("kb-active-char");
764+ this.useAltChars = false;
765+}
766+},
767+
768+
769+/* oskb */
770+_safeRemove:function(){
771+this.controller.scene.removeContainer(this.controller.element);
772+if(this.controller.element&&this.controller.element.parentNode){
773+Element.remove(this.controller.element);
774+}
775+},
776+
777+
778+/* oskb */
779+_insertChar:function(origValue,letter,start,end){
780+var value='';
781+if(origValue){
782+value=origValue.substring(0,start);
783+value+=letter;
784+value+=origValue.substring(end,origValue.length);
785+}else{
786+value=letter;
787+}
788+return value;
789+},
790+
791+
792+/* oskb */
793+advance:function(){
794+var old=this._selectedIdxElem();
795+var newElm;
796+
797+if(this.selectedIndex+1>this.charList.length-1){
798+this.selectedIndex=0;
799+}else{
800+this.selectedIndex++;
801+}
802+
803+/* oskb */
804+newElm=this._selectedIdxElem();
805+this._updateSelected(old,newElm);
806+},
807+
808+
809+/* oskb */
810+retreat:function(){
811+var old,newElm;
812+
813+old=this._selectedIdxElem();
814+if(this.selectedIndex===0){
815+this.selectedIndex=this.charList.length-1;
816+}else{
817+this.selectedIndex=this.selectedIndex-1;
818+}
819+newElm=this._selectedIdxElem();
820+this._updateSelected(old,newElm);
821+},
822+
823+
824+/* oskb */
825+_getMatching:function(element,query){
826+if(!element){
827+return;
828+}
829+return element.querySelector("[name='"+query+"']");
830+},
831+
832+
833+/* oskb */
834+_updateSelected:function(oldSelection,newSelection){
835+var node;
836+if(oldSelection){
837+node=this._getMatching(oldSelection,oldSelection.getAttribute("name"));
838+if(node){
839+node.removeClassName("selected-char");
840+}
841+}
842+if(newSelection){
843+node=this._getMatching(newSelection,newSelection.getAttribute("name"));
844+if(node){
845+node.addClassName("selected-char");
846+}
847+}
848+},
849+
850+
851+
852+/* oskb */
853+moveDown:function(){
854+var old,newElm;
855+if(this.selectedIndex+this.perLine<this.charList.length){
856+old=this._selectedIdxElement();
857+this.selectedIndex=this.selectedIndex+this.perLine;
858+newElm=this._selectedIdxElement();
859+this._updateSelected(old,newElm);
860+}
861+},
862+
863+
864+/* oskb */
865+moveUp:function(){
866+var old,newElm;
867+if(this.selectedIndex-this.perLine>=0){
868+old=this._selectedIdxElem();
869+this.selectedIndex=this.selectedIndex-this.perLine;
870+newElm=this._selectedIdxElem();
871+this._updatedSelected(old,newElm);
872+}
873+},
874+
875+
876+/* oskb */
877+updatePosition:function(key){
878+switch(key){
879+case Mojo.Char.leftArrow:
880+this.retreat();
881+break;
882+case Mojo.Char.upArrow:
883+this.moveUp();
884+break;
885+case Mojo.Char.rightArrow:
886+this.advance();
887+break;
888+case Mojo.Char.downArrow:
889+this.moveDown();
890+break;
891+default:
892+break;
893+}
894+
895+if(this.charPicker){
896+this.controller.get(this.divPrefix+'-char-selector').mojo.revealElement(this._selectedIdxElem());
897+}
898+},
899+
900+
901+
902+/* oskb */
903+handleKeyUpEvent:function(event){
904+if (event.keyCode === Mojo.Char.metaKey) {
905+ this.exitSelector();
906+}
907+return;
908+var keyCode=event.keyCode;
909+var chr;
910+
911+this.exitSelector();
912+return;
913+
914+if(this.isSymKey(keyCode)){
915+if(this.state===this.VIRT_KB_FILTERING_STATE){
916+chr=this.getEntered();
917+}
918+this.exitSelector(chr);
919+Event.stop(event);
920+return;
921+}
922+},
923+
924+
925+/* oskb */
926+handleKeyEvent:function(event){
927+return;
928+var keyCode=event.keyCode;
929+
930+if(Mojo.Char.isEnterKey(keyCode)){
931+this.exitSelector(this.getEntered());
932+Event.stop(event);
933+
934+return;
935+}
936+if(Mojo.Char.isDeleteKey(keyCode)){
937+this.exitSelector();
938+Event.stop(event);
939+return;
940+}
941+if(this.isDirectionalKey(keyCode)){
942+this.updatePosition(keyCode);
943+Event.stop(event);
944+return;
945+}
946+
947+if(!Mojo.Char.isValid(keyCode)){
948+return;
949+}
950+
951+switch(this.state){
952+case this.VIRT_KB_OPEN:
953+case this.VIRT_KB_FILTERING_STATE:
954+case this.VIRT_KB_EMPTY:
955+this.enterFilteringState(keyCode);
956+Event.stop(event);
957+break;
958+default:
959+break;
960+}
961+},
962+
963+/* oskb */
964+maybeChangeLayout:function(){
965+ var orientation = this.controller.stageController.getWindowOrientation();
966+ switch (this.layout) {
967+ case "portrait":
968+ if (orientation==="left" || orientation==="right") {
969+ this.renderWidget();
970+ }
971+ break;
972+ case "landscape":
973+ if (orientation==="up" || orientation==="down") {
974+ this.renderWidget();
975+ }
976+ break;
977+ }
978+},
979+
980+/* oskb */
981+playClick:function(){
982+var request = new Mojo.Service.Request('palm://com.palm.crotest', {
983+ method: 'PlaySound',
984+ parameters: {"file":this.VIRT_KB_SOUNDS_PATH + this.clickFile}
985+ });
986+},
987+
988+/* oskb */
989+vibrate:function(){
990+var request2 = new Mojo.Service.Request('palm://com.palm.vibrate', {
991+ method: 'vibrate',
992+ parameters: {"period": 0, "duration": this.haptic}
993+ });
994+},
995+
996+/* oskb */
997+handleOrientation:function(event){
998+/*TODO: I'm not sure why, but every change I get two events, back to back.
999+ * For now just ignore the 2nd orient event */
1000+if (this.ignoreSecond) {
1001+ this.ignoreSecond=false;
1002+ return;
1003+}
1004+else {
1005+ this.ignoreSecond=true;
1006+ this.maybeChangeLayout();
1007+}
1008+},
1009+
1010+/* oskb */
1011+handleMouseDown:function(event){
1012+if (this.scrollEnabled || this.dragEnabled) {
1013+ return;
1014+}
1015+
1016+if (this.isInKeyboard(event.target)) {
1017+ event.stop();
1018+ this.stopScroll=true;
1019+ if (this.haptic > 0 && this.haptic <= 100) {
1020+ this.vibrate();
1021+ }
1022+
1023+ var name = event.target.getAttribute('name');
1024+ this.preview=this.controller.get(this.divPrefix+"-"+name);
1025+ if (this.preview) {
1026+ this.preview.addClassName("kb-selected-char");
1027+ }
1028+}
1029+},
1030+
1031+/* oskb */
1032+handleMouseOver:function(event){
1033+if (this.scrollEnabled || this.dragEnabled) {
1034+ return;
1035+}
1036+
1037+if (this.preview && (this.preview !== event.target)) {
1038+ this.preview.removeClassName("kb-selected-char");
1039+ this.preview=undefined;
1040+}
1041+
1042+if (this.isInKeyboard(event.target)) {
1043+ event.stop();
1044+ this.stopScroll=true;
1045+ var name = event.target.getAttribute('name');
1046+ this.preview=this.controller.get(this.divPrefix+"-"+name);
1047+ if (this.preview) {
1048+ this.preview.addClassName("kb-selected-char");
1049+ }
1050+}
1051+},
1052+
1053+/* oskb */
1054+handleMouseUp:function(event){
1055+this.stopScroll=false;
1056+if (this.scrollEnabled || this.dragEnabled) {
1057+ return;
1058+}
1059+
1060+if (this.isInKeyboard(event.target)) {
1061+ event.stop();
1062+ if (this.clickFile) {
1063+ this.playClick();
1064+ }
1065+
1066+ if (this.preview) {
1067+ this.preview.removeClassName.bind(this.preview).defer("kb-selected-char");
1068+ this.preview=undefined;
1069+ }
1070+
1071+ if (this.state === this.VIRT_KB_OPEN){
1072+ this.exitSelector(this.getSelected(event.target));
1073+ }
1074+}
1075+},
1076+
1077+/* oskb */
1078+handleTapEvent:function(event){
1079+if (!this.scrollEnabled) {
1080+ return;
1081+}
1082+
1083+if (this.state === this.VIRT_KB_OPEN){
1084+ if (this.isInKeyboard(event.target)) {
1085+ event.stop();
1086+ var name = event.target.getAttribute('name');
1087+ this.preview=this.controller.get(this.divPrefix+"-"+name);
1088+ if (this.preview) {
1089+ this.preview.addClassName("kb-selected-char");
1090+ }
1091+ this.exitSelector(this.charList[name]);
1092+ if (this.preview) {
1093+ this.preview.removeClassName.bind(this.preview).defer("kb-selected-char");
1094+ }
1095+ }
1096+}
1097+},
1098+
1099+/* oskb */
1100+handleDragStart:function(event){
1101+if (this.dragEnabled && !this.scrollEnabled && this.isInKeyboard(event.target)) {
1102+ /* Set the keyboard absolutely positioned inside the charpicker, and then set the charpicker to be fixed
1103+ * to the entire viewport so it can be used as the drop container */
1104+ this.keyboard.setStyle({"position":"absolute","top":this.charPicker.offsetTop+'px'});
1105+ this.charPicker.setStyle({"position":"fixed","width":"100%","height":"100%","left":"0px","top":"0px"});
1106+
1107+ Mojo.Drag.setupDropContainer(this.charPicker,this);
1108+ Mojo.Drag.startDragging(this.controller.scene,this.keyboard,event.down,
1109+ {
1110+ preventHorizontal:true,
1111+ preventDropReset:true,
1112+ draggingClass: "kb-drag",
1113+ maxVerticalPixel: this.maxVert,
1114+ minVerticalPixel: 0
1115+ });
1116+ event.stop();
1117+}
1118+else if (this.stopScroll) {
1119+ event.stop();
1120+}
1121+},
1122+
1123+/* oskb */
1124+handleDragging:function(event){
1125+ if (this.stopScroll) {
1126+ event.stop();
1127+ }
1128+},
1129+
1130+/* oskb */
1131+handleDragEnd:function(event){
1132+if (this.dragEnabled && !this.scrollEnabled) {
1133+ /* Done dragging, so set the charpicker that was being used as the drop container back down
1134+ * to the actual keyboard size, and set the keyboard back to fit exactly inside *
1135+ * TODO: Store keyboard size from css rather than hard-coded here */
1136+ this.charPicker.setStyle({"width":"320px","height":"264px","top":this.keyboard.offsetTop+'px'});
1137+ this.keyboard.setStyle({"top":"0px"});
1138+ this.dragEnabled = false;
1139+ this.blankDivLeft.removeClassName("kb-active-char locked");
1140+ this.blankDivRight.removeClassName("kb-active-char locked");
1141+}
1142+else if (this.stopScroll) {
1143+ event.stop();
1144+}
1145+},
1146+
1147+/* oskb */
1148+dragDrop:function() {
1149+// Dummy function to avoid error/warnings from Dragger
1150+},
1151+
1152+/* oskb */
1153+getEntered:function(){
1154+return this.charList[this.selectedIndex];
1155+},
1156+
1157+/* oskb */
1158+getSelected:function(target){
1159+var chr=target.getAttribute('name');
1160+
1161+return this.charList[chr];
1162+},
1163+
1164+
1165+
1166+
1167+
1168+
1169+/* oskb */
1170+isDirectionalKey:function(key){
1171+if(key==Mojo.Char.leftArrow||key==Mojo.Char.upArrow||key==Mojo.Char.rightArrow||key==Mojo.Char.downArrow){
1172+return true;
1173+}
1174+return false;
1175+},
1176+
1177+
1178+/* oskb */
1179+isInCharPicker:function(target){
1180+if(!this.charPicker){
1181+return;
1182+}
1183+if(target.id==this.charPicker.id||Element.up(target,'div#'+this.charPicker.id)){
1184+return true;
1185+}
1186+return false;
1187+},
1188+
1189+/* oskb */
1190+isInKeyboard:function(target){
1191+if(!this.keyboard){
1192+return;
1193+}
1194+if(Element.up(target,'div#'+this.keyboard.id)){
1195+return true;
1196+}
1197+return false;
1198+},
1199+
1200+
1201+/* oskb */
1202+isSymKey:function(keyCode){
1203+return keyCode===Mojo.Char.sym;
1204+},
1205+
1206+
1207+/* oskb */
1208+_selectedIdxElem:function(){
1209+return this.controller.get(this.divPrefix+"-"+this.selectedIndex);
1210+},
1211+
1212+
1213+/* oskb */
1214+handleCommand:function(commandEvent){
1215+if(commandEvent.type===Mojo.Event.back&&(this.state!==this.VIRT_KB_CLOSED&&this.state!==this.VIRT_KB_EMPTY)){
1216+this.exitSelector();
1217+Event.stop(commandEvent);
1218+}
1219+}
1220+});
1221+
1222 /* Compressed by the perl version of jsmin. */
1223 /* JavaScript::Minifier 0.02 */
1224
1225diff --git a/usr/palm/frameworks/mojo/submissions/191.15/resources/en_us/kbchars_fulltable.json b/usr/palm/frameworks/mojo/submissions/191.15/resources/en_us/kbchars_fulltable.json
1226new file mode 100644
1227index 0000000..1d35116
1228--- /dev/null
1229+++ b/usr/palm/frameworks/mojo/submissions/191.15/resources/en_us/kbchars_fulltable.json
1230@@ -0,0 +1,86 @@
1231+[
1232+ {"keyCode": 81, "letter":"q", "list": ["q"], alt: "/"},
1233+ {"keyCode": 87, "letter":"w", "list": ["w"], alt: "+"},
1234+ {"keyCode": 69, "letter":"e", "list": ["e"], alt: "1"},
1235+ {"keyCode": 82, "letter":"r", "list": ["r"], alt: "2"},
1236+ {"keyCode": 84, "letter":"t", "list": ["t"], alt: "3"},
1237+ {"keyCode": 89, "letter":"y", "list": ["y"], alt: "("},
1238+ {"keyCode": 85, "letter":"u", "list": ["u"], alt: ")"},
1239+ {"keyCode": 73, "letter":"i", "list": ["i"], alt: "%"},
1240+ {"keyCode": 79, "letter":"o", "list": ["o"], alt: "\""},
1241+ {"keyCode": 80, "letter":"p", "list": ["p"], alt: "="},
1242+
1243+ {"keyCode": 65, "letter":"a", "list": ["a"], alt: "&"},
1244+ {"keyCode": 83, "letter":"s", "list": ["s"], alt: "-"},
1245+ {"keyCode": 68, "letter":"d", "list": ["d"], alt: "4"},
1246+ {"keyCode": 70, "letter":"f", "list": ["f"], alt: "5"},
1247+ {"keyCode": 71, "letter":"g", "list": ["g"], alt: "6"},
1248+ {"keyCode": 72, "letter":"h", "list": ["h"], alt: "$"},
1249+ {"keyCode": 74, "letter":"j", "list": ["j"], alt: "!"},
1250+ {"keyCode": 75, "letter":"k", "list": ["k"], alt: ":"},
1251+ {"keyCode": 76, "letter":"l", "list": ["l"], alt: "'"},
1252+ {"keyCode": 8, "letter":"\b", "list": ["&laquo"]},
1253+
1254+ {"keyCode": 18, "letter":"alt-orange", "list": ["&curren"]},
1255+ {"keyCode": 90, "letter":"z", "list": ["z"], alt: "*"},
1256+ {"keyCode": 88, "letter":"x", "list": ["x"], alt: "7"},
1257+ {"keyCode": 67, "letter":"c", "list": ["c"], alt: "8"},
1258+ {"keyCode": 86, "letter":"v", "list": ["v"], alt: "9"},
1259+ {"keyCode": 66, "letter":"b", "list": ["b"], alt: "#"},
1260+ {"keyCode": 78, "letter":"n", "list": ["n"], alt: "?"},
1261+ {"keyCode": 77, "letter":"m", "list": ["m"], alt: ";"},
1262+ {"keyCode": 188, "letter":",", "list": [","], alt: "_"},
1263+ {"keyCode": 13, "letter":"\n", "list": ["&raquo"]},
1264+
1265+ {"keyCode": 00, "letter":"blank", "list": ["&deg"]},
1266+ {"keyCode": 16, "letter":"shift", "list": ["&yen"], "span": 1.5},
1267+ {"keyCode": 90, "letter":"@", "list": ["@"], alt: "0"},
1268+ {"keyCode": 32, "letter":" ", "list": ["&nbsp"], "span": 3},
1269+ {"keyCode": 190, "letter":".", "list": ["."]},
1270+ {"keyCode": 17, "letter":"sym-ctrl", "list": ["&iquest"], "span": 1.5},
1271+ {"keyCode": 00, "letter":"blank", "list": ["&deg"]},
1272+
1273+ {"keyCode": 190, "letter":"", "list": ["/","?","+","(",")","%","\"","=","&","-","$","!",":","'","&","#","_"]},
1274+ {"keyCode": 48, "letter":"0", "list": ["0"]},
1275+ {"keyCode": 49, "letter":"1", "list": ["1"]},
1276+ {"keyCode": 50, "letter":"2", "list": ["2"]},
1277+ {"keyCode": 51, "letter":"3", "list": ["3"]},
1278+ {"keyCode": 52, "letter":"4", "list": ["4"]},
1279+ {"keyCode": 53, "letter":"5", "list": ["5"]},
1280+ {"keyCode": 54, "letter":"6", "list": ["6"]},
1281+ {"keyCode": 55, "letter":"7", "list": ["7"]},
1282+ {"keyCode": 56, "letter":"8", "list": ["8"]},
1283+ {"keyCode": 57, "letter":"9", "list": ["9"]},
1284+
1285+ {"keyCode": 190, "letter":"", "list": ["~","\\","•","`","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
1286+ {"keyCode": 65, "letter":"", "list": ["á","à","ä","â","ã","å","æ"]},
1287+ {"keyCode": 65, "letter":"", "list": ["Á","À","Ä","Â","Ã","Å","Æ"], "modifier": 16},
1288+ {"keyCode": 67, "letter":"", "list": ["©","ç"]},
1289+ {"keyCode": 67, "letter":"", "list": ["Ç"], "modifier": 16},
1290+ {"keyCode": 69, "letter":"", "list": ["é","è","ë","ê","ē"]},
1291+ {"keyCode": 69, "letter":"", "list": ["É","È","Ë","Ê"], "modifier": 16},
1292+ {"keyCode": 73, "letter":"", "list": ["í","ì","ï","î"]},
1293+ {"keyCode": 73, "letter":"", "list": ["Í","Ì","Ï","Î"], "modifier": 16},
1294+ {"keyCode": 78, "letter":"", "list": ["ñ"]},
1295+ {"keyCode": 78, "letter":"", "list": ["Ñ"], "modifier": 16},
1296+ {"keyCode": 79, "letter":"", "list": ["ó","ò","ö","ô","œ","õ","ø"]},
1297+ {"keyCode": 79, "letter":"", "list": ["Ó","Ò","Ö","Ô","Œ","Õ","Ø"], "modifier": 16},
1298+ {"keyCode": 83, "letter":"", "list": ["ß"]},
1299+ {"keyCode": 85, "letter":"", "list": ["ú","ù","ü","û"]},
1300+ {"keyCode": 85, "letter":"", "list": ["Ú","Ù","Ü","Û"], "modifier": 16},
1301+ {"keyCode": 88, "letter":"", "list": ["×","¤"]},
1302+ {"keyCode": 89, "letter":"", "list": ["ÿ"]},
1303+ {"keyCode": 89, "letter":"", "list": ["Ÿ"], "modifier": 16},
1304+ {"keyCode": 82, "letter":"", "list": ["®"]},
1305+ {"keyCode": 80, "letter":"", "list": ["¶"]},
1306+ {"keyCode": 84, "letter":"", "list": ["™"]},
1307+ {"keyCode": 68, "letter":"", "list": ["†","‡"], "modifier": 16},
1308+ {"keyCode": 96, "letter":"", "list": ["°"]},
1309+ {"keyCode": 97, "letter":"", "list": ["¹", "¼", "½"]},
1310+ {"keyCode": 98, "letter":"", "list": ["²"]},
1311+ {"keyCode": 99, "letter":"", "list": ["³", "¾"]},
1312+ {"keyCode": 67, "letter":"", "list": ["¡"]},
1313+ {"keyCode": 67, "letter":"", "list": ["¿"]},
1314+ {"keyCode": 67, "letter":"", "list": [":-)", ":-(", ";-)"]},
1315+ {"keyCode": 67, "letter":"", "list": ["$","¢","€","£","¥"]}
1316+]
1317diff --git a/usr/palm/frameworks/mojo/submissions/191.15/resources/en_us/kbchars_fulltable_qwertz.json b/usr/palm/frameworks/mojo/submissions/191.15/resources/en_us/kbchars_fulltable_qwertz.json
1318new file mode 100644
1319index 0000000..d4a8128
1320--- /dev/null
1321+++ b/usr/palm/frameworks/mojo/submissions/191.15/resources/en_us/kbchars_fulltable_qwertz.json
1322@@ -0,0 +1,58 @@
1323+[
1324+ {"keyCode": 65, "letter":"a", "list": ["a"]},
1325+ {"keyCode": 66, "letter":"b", "list": ["b"]},
1326+ {"keyCode": 67, "letter":"c", "list": ["c"]},
1327+ {"keyCode": 68, "letter":"d", "list": ["d"]},
1328+ {"keyCode": 69, "letter":"e", "list": ["e"]},
1329+ {"keyCode": 70, "letter":"f", "list": ["f"]},
1330+ {"keyCode": 70, "letter":"g", "list": ["g"]},
1331+ {"keyCode": 70, "letter":"h", "list": ["h"]},
1332+ {"keyCode": 70, "letter":"i", "list": ["i"]},
1333+ {"keyCode": 70, "letter":"j", "list": ["j"]},
1334+ {"keyCode": 70, "letter":"k", "list": ["k"]},
1335+ {"keyCode": 70, "letter":"l", "list": ["l"]},
1336+ {"keyCode": 70, "letter":"m", "list": ["m"]},
1337+ {"keyCode": 70, "letter":"n", "list": ["n"]},
1338+ {"keyCode": 70, "letter":"o", "list": ["o"]},
1339+ {"keyCode": 80, "letter":"p", "list": ["p"]},
1340+ {"keyCode": 80, "letter":"q", "list": ["q"]},
1341+ {"keyCode": 80, "letter":"r", "list": ["r"]},
1342+ {"keyCode": 80, "letter":"s", "list": ["s"]},
1343+ {"keyCode": 80, "letter":"t", "list": ["t"]},
1344+ {"keyCode": 80, "letter":"u", "list": ["u"]},
1345+ {"keyCode": 80, "letter":"v", "list": ["v"]},
1346+ {"keyCode": 80, "letter":"w", "list": ["w"]},
1347+ {"keyCode": 80, "letter":"x", "list": ["x"]},
1348+ {"keyCode": 80, "letter":"y", "list": ["y"]},
1349+ {"keyCode": 90, "letter":"z", "list": ["z"]},
1350+ {"keyCode": 90, "letter":"z", "list": ["z"]},
1351+ {"keyCode": 65, "letter":"A", "list": ["A"], "modifier": 16},
1352+ {"keyCode": 67, "letter":"c", "list": ["©","ç"]},
1353+ {"keyCode": 67, "letter":"C", "list": ["Ç"], "modifier": 16},
1354+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē"]},
1355+ {"keyCode": 69, "letter":"E", "list": ["É","È","Ë","Ê"], "modifier": 16},
1356+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î"]},
1357+ {"keyCode": 73, "letter":"I", "list": ["Í","Ì","Ï","Î"], "modifier": 16},
1358+ {"keyCode": 78, "letter":"n", "list": ["ñ"]},
1359+ {"keyCode": 78, "letter":"N", "list": ["Ñ"], "modifier": 16},
1360+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø"]},
1361+ {"keyCode": 79, "letter":"O", "list": ["Ó","Ò","Ö","Ô","Œ","Õ","Ø"], "modifier": 16},
1362+ {"keyCode": 83, "letter":"s", "list": ["ß"]},
1363+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û"]},
1364+ {"keyCode": 85, "letter":"U", "list": ["Ú","Ù","Ü","Û"], "modifier": 16},
1365+ {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
1366+ {"keyCode": 89, "letter":"y", "list": ["ÿ"]},
1367+ {"keyCode": 89, "letter":"Y", "list": ["Ÿ"], "modifier": 16},
1368+ {"keyCode": 82, "letter":"r", "list": ["®"]},
1369+ {"keyCode": 80, "letter":"p", "list": ["¶"]},
1370+ {"keyCode": 84, "letter":"t", "list": ["™"]},
1371+ {"keyCode": 68, "letter":"D", "list": ["†","‡"], "modifier": 16},
1372+ {"keyCode": 96, "letter":"0", "list": ["°"]},
1373+ {"keyCode": 97, "letter":"1", "list": ["¹", "¼", "½"]},
1374+ {"keyCode": 98, "letter":"2", "list": ["²"]},
1375+ {"keyCode": 99, "letter":"3", "list": ["³", "¾"]},
1376+ {"keyCode": 67, "letter":"!", "list": ["¡"]},
1377+ {"keyCode": 67, "letter":"?", "list": ["¿"]},
1378+ {"keyCode": 67, "letter":":", "list": [":-)", ":-(", ";-)"]},
1379+ {"keyCode": 67, "letter":"$", "list": ["$","¢","€","£","¥"]}
1380+]
1381diff --git a/usr/palm/frameworks/mojo/submissions/191.15/resources/en_us/kbchars_table.json b/usr/palm/frameworks/mojo/submissions/191.15/resources/en_us/kbchars_table.json
1382new file mode 100644
1383index 0000000..8544247
1384--- /dev/null
1385+++ b/usr/palm/frameworks/mojo/submissions/191.15/resources/en_us/kbchars_table.json
1386@@ -0,0 +1,30 @@
1387+[
1388+ {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
1389+ {"keyCode": 66, "letter":"b", "list": ["b"]},
1390+ {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
1391+ {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]},
1392+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
1393+ {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
1394+ {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
1395+ {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
1396+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
1397+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥","ƒ"]},
1398+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
1399+ {"keyCode": 74, "letter":"j", "list": ["¡"]},
1400+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
1401+ {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛","\""]},
1402+ {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
1403+ {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
1404+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
1405+ {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
1406+ {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
1407+ {"keyCode": 82, "letter":"r", "list": ["®","²"]},
1408+ {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
1409+ {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
1410+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
1411+ {"keyCode": 86, "letter":"v", "list": ["^"]},
1412+ {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
1413+ {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
1414+ {"keyCode": 89, "letter":"y", "list": ["ÿ","ý","Ÿ","Ý","¥","[","]","{","}","<",">","«","»"]},
1415+ {"keyCode": 90, "letter":"z", "list": ["ž","Ž","•"]}
1416+]
1417diff --git a/usr/palm/frameworks/mojo/submissions/191.15/resources/en_us/kbchars_table_azerty.json b/usr/palm/frameworks/mojo/submissions/191.15/resources/en_us/kbchars_table_azerty.json
1418new file mode 100644
1419index 0000000..8180a5a
1420--- /dev/null
1421+++ b/usr/palm/frameworks/mojo/submissions/191.15/resources/en_us/kbchars_table_azerty.json
1422@@ -0,0 +1,29 @@
1423+[
1424+ {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
1425+ {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
1426+ {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]},
1427+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
1428+ {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
1429+ {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
1430+ {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
1431+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
1432+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥","ƒ"]},
1433+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
1434+ {"keyCode": 74, "letter":"j", "list": ["¡"]},
1435+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
1436+ {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛","\""]},
1437+ {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
1438+ {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
1439+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
1440+ {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
1441+ {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
1442+ {"keyCode": 82, "letter":"r", "list": ["®","²"]},
1443+ {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
1444+ {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
1445+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
1446+ {"keyCode": 86, "letter":"v", "list": ["^"]},
1447+ {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
1448+ {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
1449+ {"keyCode": 89, "letter":"y", "list": ["ÿ","ý","Ÿ","Ý","¥","[","]","{","}","<",">","«","»"]},
1450+ {"keyCode": 90, "letter":"z", "list": ["ž","Ž","•"]}
1451+]
1452\ No newline at end of file
1453diff --git a/usr/palm/frameworks/mojo/submissions/191.15/resources/en_us/kbchars_table_qwertz.json b/usr/palm/frameworks/mojo/submissions/191.15/resources/en_us/kbchars_table_qwertz.json
1454new file mode 100644
1455index 0000000..8180a5a
1456--- /dev/null
1457+++ b/usr/palm/frameworks/mojo/submissions/191.15/resources/en_us/kbchars_table_qwertz.json
1458@@ -0,0 +1,29 @@
1459+[
1460+ {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
1461+ {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
1462+ {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]},
1463+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
1464+ {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
1465+ {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
1466+ {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
1467+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
1468+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥","ƒ"]},
1469+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
1470+ {"keyCode": 74, "letter":"j", "list": ["¡"]},
1471+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
1472+ {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛","\""]},
1473+ {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
1474+ {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
1475+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
1476+ {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
1477+ {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
1478+ {"keyCode": 82, "letter":"r", "list": ["®","²"]},
1479+ {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
1480+ {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
1481+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
1482+ {"keyCode": 86, "letter":"v", "list": ["^"]},
1483+ {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
1484+ {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
1485+ {"keyCode": 89, "letter":"y", "list": ["ÿ","ý","Ÿ","Ý","¥","[","]","{","}","<",">","«","»"]},
1486+ {"keyCode": 90, "letter":"z", "list": ["ž","Ž","•"]}
1487+]
1488\ No newline at end of file
1489diff --git a/usr/palm/frameworks/mojo/submissions/191.15/resources/kbchars_fulltable.json b/usr/palm/frameworks/mojo/submissions/191.15/resources/kbchars_fulltable.json
1490new file mode 100644
1491index 0000000..6774f8f
1492--- /dev/null
1493+++ b/usr/palm/frameworks/mojo/submissions/191.15/resources/kbchars_fulltable.json
1494@@ -0,0 +1,87 @@
1495+[
1496+ {"keyCode": 80, "letter":"q", "list": ["q"]},
1497+ {"keyCode": 80, "letter":"w", "list": ["w"]},
1498+ {"keyCode": 69, "letter":"e", "list": ["e"]},
1499+ {"keyCode": 80, "letter":"r", "list": ["r"]},
1500+ {"keyCode": 80, "letter":"t", "list": ["t"]},
1501+ {"keyCode": 80, "letter":"y", "list": ["y"]},
1502+ {"keyCode": 80, "letter":"u", "list": ["u"]},
1503+ {"keyCode": 70, "letter":"i", "list": ["i"]},
1504+ {"keyCode": 70, "letter":"o", "list": ["o"]},
1505+ {"keyCode": 80, "letter":"p", "list": ["p"]},
1506+
1507+ {"keyCode": 65, "letter":"a", "list": ["a"]},
1508+ {"keyCode": 80, "letter":"s", "list": ["s"]},
1509+ {"keyCode": 68, "letter":"d", "list": ["d"]},
1510+ {"keyCode": 70, "letter":"f", "list": ["f"]},
1511+ {"keyCode": 70, "letter":"g", "list": ["g"]},
1512+ {"keyCode": 70, "letter":"h", "list": ["h"]},
1513+ {"keyCode": 70, "letter":"j", "list": ["j"]},
1514+ {"keyCode": 70, "letter":"k", "list": ["k"]},
1515+ {"keyCode": 70, "letter":"l", "list": ["l"]},
1516+ {"keyCode": 8, "letter":"\b", "list": ["&laquo"]},
1517+
1518+ {"keyCode": 90, "letter":"O", "list": ["O"]},
1519+ {"keyCode": 90, "letter":"z", "list": ["z"]},
1520+ {"keyCode": 80, "letter":"x", "list": ["x"]},
1521+ {"keyCode": 67, "letter":"c", "list": ["c"]},
1522+ {"keyCode": 80, "letter":"v", "list": ["v"]},
1523+ {"keyCode": 66, "letter":"b", "list": ["b"]},
1524+ {"keyCode": 70, "letter":"n", "list": ["n"]},
1525+ {"keyCode": 70, "letter":"m", "list": ["m"]},
1526+ {"keyCode": 90, "letter":",", "list": [","]},
1527+ {"keyCode": 90, "letter":"\n", "list": ["&raquo"]},
1528+
1529+ {"keyCode": 90, "letter":"blank", "list": ["&deg"]},
1530+ {"keyCode": 90, "letter":"shift", "list": ["&yen"]},
1531+ {"keyCode": 90, "letter":"@", "list": ["@"]},
1532+ {"keyCode": 90, "letter":" ", "list": ["&nbsp"]},
1533+ {"keyCode": 90, "letter":" ", "list": ["&nbsp"]},
1534+ {"keyCode": 90, "letter":" ", "list": ["&nbsp"]},
1535+ {"keyCode": 90, "letter":" ", "list": ["&nbsp"]},
1536+ {"keyCode": 90, "letter":".", "list": ["."]},
1537+ {"keyCode": 90, "letter":"sym", "list": ["&iquest"]},
1538+ {"keyCode": 90, "letter":"blank", "list": ["&deg"]},
1539+
1540+ {"keyCode": 90, "letter":"0", "list": ["0"]},
1541+ {"keyCode": 90, "letter":"1", "list": ["1"]},
1542+ {"keyCode": 90, "letter":"2", "list": ["2"]},
1543+ {"keyCode": 90, "letter":"3", "list": ["3"]},
1544+ {"keyCode": 90, "letter":"4", "list": ["4"]},
1545+ {"keyCode": 90, "letter":"5", "list": ["5"]},
1546+ {"keyCode": 90, "letter":"6", "list": ["6"]},
1547+ {"keyCode": 90, "letter":"7", "list": ["7"]},
1548+ {"keyCode": 90, "letter":"8", "list": ["8"]},
1549+ {"keyCode": 90, "letter":"9", "list": ["9"]},
1550+ {"keyCode": 90, "letter":".", "list": ["."]},
1551+
1552+ {"keyCode": 65, "letter":"A", "list": ["A"], "modifier": 16},
1553+ {"keyCode": 67, "letter":"c", "list": ["©","ç"]},
1554+ {"keyCode": 67, "letter":"C", "list": ["Ç"], "modifier": 16},
1555+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē"]},
1556+ {"keyCode": 69, "letter":"E", "list": ["É","È","Ë","Ê"], "modifier": 16},
1557+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î"]},
1558+ {"keyCode": 73, "letter":"I", "list": ["Í","Ì","Ï","Î"], "modifier": 16},
1559+ {"keyCode": 78, "letter":"n", "list": ["ñ"]},
1560+ {"keyCode": 78, "letter":"N", "list": ["Ñ"], "modifier": 16},
1561+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø"]},
1562+ {"keyCode": 79, "letter":"O", "list": ["Ó","Ò","Ö","Ô","Œ","Õ","Ø"], "modifier": 16},
1563+ {"keyCode": 83, "letter":"s", "list": ["ß"]},
1564+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û"]},
1565+ {"keyCode": 85, "letter":"U", "list": ["Ú","Ù","ÜÛ"], "modifier": 16},
1566+ {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
1567+ {"keyCode": 89, "letter":"y", "list": ["ÿ"]},
1568+ {"keyCode": 89, "letter":"Y", "list": ["Ÿ"], "modifier": 16},
1569+ {"keyCode": 82, "letter":"r", "list": ["®"]},
1570+ {"keyCode": 80, "letter":"p", "list": ["¶"]},
1571+ {"keyCode": 84, "letter":"t", "list": ["™"]},
1572+ {"keyCode": 68, "letter":"D", "list": ["†","‡"], "modifier": 16},
1573+ {"keyCode": 96, "letter":"0", "list": ["°"]},
1574+ {"keyCode": 97, "letter":"1", "list": ["¹", "¼", "½"]},
1575+ {"keyCode": 98, "letter":"2", "list": ["²"]},
1576+ {"keyCode": 99, "letter":"3", "list": ["³", "¾"]},
1577+ {"keyCode": 67, "letter":"!", "list": ["¡"]},
1578+ {"keyCode": 67, "letter":"?", "list": ["¿"]},
1579+ {"keyCode": 67, "letter":":", "list": [":-)", ":-(", ";-)"]},
1580+ {"keyCode": 67, "letter":"$", "list": ["$","¢","€","£","¥"]}
1581+]
1582diff --git a/usr/palm/frameworks/mojo/submissions/191.15/stylesheets/global.css b/usr/palm/frameworks/mojo/submissions/191.15/stylesheets/global.css
1583index 39fa4ec..b98b50c 100644
1584--- a/usr/palm/frameworks/mojo/submissions/191.15/stylesheets/global.css
1585+++ b/usr/palm/frameworks/mojo/submissions/191.15/stylesheets/global.css
1586@@ -16,6 +16,7 @@
1587 @import url(global-iconography.css);
1588 @import url(global-widget-addressing.css);
1589 @import url(global-widget-mvpicker.css);
1590+@import url(webos-internals-virtual-keyboard.css);
1591
1592 a {
1593 color: #00c;
1594@@ -665,4 +666,4 @@ span.selected-char {
1595 height: 111px;
1596 background: url(../images/disclaimer-beta.png) no-repeat;
1597 -webkit-palm-mouse-target: ignore;
1598-}
1599\ No newline at end of file
1600+}
1601diff --git a/usr/palm/frameworks/mojo/submissions/191.15/stylesheets/webos-internals-virtual-keyboard.css b/usr/palm/frameworks/mojo/submissions/191.15/stylesheets/webos-internals-virtual-keyboard.css
1602new file mode 100755
1603index 0000000..6062691
1604--- /dev/null
1605+++ b/usr/palm/frameworks/mojo/submissions/191.15/stylesheets/webos-internals-virtual-keyboard.css
1606@@ -0,0 +1,97 @@
1607+/* Styles for On Screen Keyboard */
1608+
1609+.kb-char-selector-container {
1610+ position: fixed;
1611+ z-index: 199500; /* same as popup */
1612+ width: 320px;
1613+ height: 264px;
1614+ left: 0px;
1615+}
1616+
1617+.kb-char-selector-wrapper {
1618+}
1619+
1620+.kb-char-selector-scroller {
1621+ position: absolute;
1622+ top: 0px;
1623+ padding: 0px;
1624+ max-height: 264px;
1625+ overflow: hidden;
1626+}
1627+
1628+.kb-char-selector-content {
1629+ margin-top:72px;
1630+}
1631+
1632+.kb-char-selector-column {
1633+ width: 320px;
1634+ height: 48px;
1635+}
1636+
1637+.kb-char-selector-element{
1638+ color: black;
1639+ width:10%;
1640+ height:48px;
1641+ line-height:48px;
1642+ display:inline-block;
1643+ float:left;
1644+ font-weight: normal;
1645+ text-align: center;
1646+ vertical-align: middle;
1647+ margin-right: -1px;
1648+ border-bottom: 1px solid #999;
1649+ border-right: 1px solid #999;
1650+}
1651+
1652+.kb-char-selector-element .kb-img{
1653+ position: relative;
1654+ width: 100%;
1655+ height: 100%;
1656+}
1657+
1658+.kb-char-selector-element .kb-span{
1659+ position: relative;
1660+}
1661+
1662+.kb-char-selector-element.kb-selected-char .kb-span{
1663+ left: -25%;
1664+ top: -150%;
1665+ color: red;
1666+}
1667+
1668+.kb-char-selector-element.kb-selected-char .kb-img{
1669+ width: 150%;
1670+ height: 150%;
1671+}
1672+
1673+/*
1674+.kb-char-selector-element.kb-active-char{
1675+ background:#0072ff;
1676+}
1677+
1678+.kb-char-selector-element.kb-active-char.locked{
1679+ background:#984c08;
1680+}
1681+ */
1682+
1683+.kb-char-selector-element.kb-active-char .kb-img{
1684+ position: relative;
1685+ width: 70%;
1686+ height: 70%;
1687+ top:15%;
1688+}
1689+
1690+.kb-char-selector-element.kb-active-char.locked .kb-img{
1691+ width: 50%;
1692+ height: 50%;
1693+ top:15%;
1694+}
1695+
1696+/* Landscape rows */
1697+.kb-char-selector-container.landscape {
1698+ width: 480px;
1699+}
1700+
1701+.kb-char-selector-column.landscape {
1702+ width: 480px;
1703+}
1704diff --git a/usr/palm/frameworks/mojo/submissions/191.15/templates/kbselector/char-ls.html b/usr/palm/frameworks/mojo/submissions/191.15/templates/kbselector/char-ls.html
1705new file mode 100644
1706index 0000000..3d78ff7
1707--- /dev/null
1708+++ b/usr/palm/frameworks/mojo/submissions/191.15/templates/kbselector/char-ls.html
1709@@ -0,0 +1,3 @@
1710+<div id="#{divPrefix}-#{index}" name="#{index}" class="kb-char-selector-element landscape" x-mojo-tap-highlight="momentary">
1711+ <span name="#{index}" class="kb-span">#{-character}</span>
1712+</div>
1713diff --git a/usr/palm/frameworks/mojo/submissions/191.15/templates/kbselector/char-selector-row-ls.html b/usr/palm/frameworks/mojo/submissions/191.15/templates/kbselector/char-selector-row-ls.html
1714new file mode 100644
1715index 0000000..a5a8217
1716--- /dev/null
1717+++ b/usr/palm/frameworks/mojo/submissions/191.15/templates/kbselector/char-selector-row-ls.html
1718@@ -0,0 +1 @@
1719+<div class="kb-char-selector-column landscape">#{-characters}</div>
1720diff --git a/usr/palm/frameworks/mojo/submissions/191.15/templates/kbselector/char-selector-row.html b/usr/palm/frameworks/mojo/submissions/191.15/templates/kbselector/char-selector-row.html
1721new file mode 100644
1722index 0000000..847f837
1723--- /dev/null
1724+++ b/usr/palm/frameworks/mojo/submissions/191.15/templates/kbselector/char-selector-row.html
1725@@ -0,0 +1 @@
1726+<div class="kb-char-selector-column">#{-characters}</div>
1727\ No newline at end of file
1728diff --git a/usr/palm/frameworks/mojo/submissions/191.15/templates/kbselector/char.html b/usr/palm/frameworks/mojo/submissions/191.15/templates/kbselector/char.html
1729new file mode 100644
1730index 0000000..6cfac50
1731--- /dev/null
1732+++ b/usr/palm/frameworks/mojo/submissions/191.15/templates/kbselector/char.html
1733@@ -0,0 +1,3 @@
1734+<div id="#{divPrefix}-#{index}" name="#{index}" class="kb-char-selector-element" x-mojo-tap-highlight="momentary">
1735+ <span name="#{index}" class="kb-span">#{-character}</span>
1736+</div>
1737diff --git a/usr/palm/frameworks/mojo/submissions/191.15/templates/kbselector/charselector-ls.html b/usr/palm/frameworks/mojo/submissions/191.15/templates/kbselector/charselector-ls.html
1738new file mode 100644
1739index 0000000..84349fa
1740--- /dev/null
1741+++ b/usr/palm/frameworks/mojo/submissions/191.15/templates/kbselector/charselector-ls.html
1742@@ -0,0 +1,7 @@
1743+<div class="kb-char-selector-container landscape" id="#{divPrefix}-kb-char-selector-div">
1744+ <div class="kb-char-selector-wrapper">
1745+ <div class="kb-char-selector-scroller landscape" x-mojo-element="Scroller" id="#{divPrefix}-char-selector">
1746+ <div class="kb-char-selector-content landscape" id="char-list" x-mojo-element="List">
1747+ </div>
1748+ </div>
1749+</div>
1750diff --git a/usr/palm/frameworks/mojo/submissions/191.15/templates/kbselector/charselector.html b/usr/palm/frameworks/mojo/submissions/191.15/templates/kbselector/charselector.html
1751new file mode 100644
1752index 0000000..0675d8d
1753--- /dev/null
1754+++ b/usr/palm/frameworks/mojo/submissions/191.15/templates/kbselector/charselector.html
1755@@ -0,0 +1,7 @@
1756+<div class="kb-char-selector-container" id="#{divPrefix}-kb-char-selector-div">
1757+ <div class="kb-char-selector-wrapper">
1758+ <div class="kb-char-selector-scroller" x-mojo-element="Scroller" id="#{divPrefix}-char-selector">
1759+ <div class="kb-char-selector-content" id="char-list" x-mojo-element="List">
1760+ </div>
1761+ </div>
1762+</div>
  
1#!/bin/sh
2PATCH_PRE=add-onscreen-keyboard.patch
3PATCH_EMU=add-onscreen-keyboard-emu.patch
4PATCH=${PATCH_PRE}
5ARCH=`/bin/uname -m`
6
7if [ "$ARCH" = "i686" ]
8then
9 cd /opt/src/modifications/frameworks
10 rm -f ${PATCH_EMU}
11 git pull
12 sed s/191_15/191_14/g ${PATCH_PRE} > tmp
13 sed s/191.15/191.14/g tmp > ${PATCH_EMU}
14 rm -f tmp
15 PATCH=${PATCH_EMU}
16fi
17
18sh /opt/src/modifications/install ${PATCH}
19if [ $? -ne 0 ]
20then
21 echo "ERROR: Could not install patch!"
22 echo "Please visit http://www.webos-internals.org/wiki/Applying_Patches"
23 exit 1
24fi
25
26if [ "$ARCH" = "armv7l" ]
27then
28 echo "Remounting / rw..."
29 mount -o rw,remount /
30 if [ $? -ne 0 ]
31 then
32 echo "ERROR: Could not remount / in rw"
33 echo "Please visit http://www.webos-internals.org/wiki/Applying_Patches"
34 exit 1
35 fi
36fi
37
38cp /opt/src/modifications/frameworks/virtual-keyboard-themes.tar.gz / && cd / && tar -xvzf virtual-keyboard-themes.tar.gz && cd - && echo "SUCCESS"
39
40if [ "$ARCH" = "armv7l" ]
41then
42 echo "Remounting / to read-only"
43 mount -o ro,remount /
44fi
Binary files differ