Project

General

Profile

offscreenBuffer_4.txt

Sergey Ivanovskiy, 11/27/2015 06:59 PM

Download (67.8 KB)

 
1
=== modified file 'src/com/goldencode/p2j/ui/client/driver/web/index.html'
2
--- src/com/goldencode/p2j/ui/client/driver/web/index.html	2015-09-08 16:51:50 +0000
3
+++ src/com/goldencode/p2j/ui/client/driver/web/index.html	2015-11-27 21:17:18 +0000
4
@@ -4,6 +4,9 @@
5
       <title>P2J ${client_title} Web Client</title>
6
       
7
       <link rel="stylesheet" type="text/css" href="/dojo-toolkit/dijit/themes/claro/claro.css">
8
+      <style type="text/css">
9
+         .wait, .wait * { cursor: wait !important; }
10
+      </style>
11
       <!-- load dojo -->      
12
       <script src="/dojo-toolkit/dojo/dojo.js" data-dojo-config="async: true"></script>  
13
             
14

    
15
=== modified file 'src/com/goldencode/p2j/ui/client/driver/web/res/p2j.js'
16
--- src/com/goldencode/p2j/ui/client/driver/web/res/p2j.js	2015-10-22 23:14:19 +0000
17
+++ src/com/goldencode/p2j/ui/client/driver/web/res/p2j.js	2015-11-27 23:25:13 +0000
18
@@ -96,9 +96,13 @@
19
       
20
       // save off our client mode type
21
       p2j.isGui = cfg.isGui;
22
+      // the body html css class name to display wait cursor
23
+      p2j.waitCursorClass = "wait";
24
+      // the body html css class name to display default cursor
25
+      p2j.defaultBodyHtmlClass = "claro";
26
 
27
       // init modules (don't change the order here!)
28
-      p2j.logger.init(4096);
29
+      p2j.logger.init(4096, true);
30
       p2j.sound.init(cfg);
31
       p2j.fonts.init();
32
       p2j.screen.init(cfg);
33

    
34
=== modified file 'src/com/goldencode/p2j/ui/client/driver/web/res/p2j.logger.js'
35
--- src/com/goldencode/p2j/ui/client/driver/web/res/p2j.logger.js	2015-09-05 16:09:44 +0000
36
+++ src/com/goldencode/p2j/ui/client/driver/web/res/p2j.logger.js	2015-11-27 15:52:16 +0000
37
@@ -24,15 +24,21 @@
38
    
39
    /** The stack capacity, the last visible history.*/
40
    var maxStackSize;
41
+
42
+   /** The stack capacity, the last visible history.*/
43
+   var isOn;
44
    /**
45
     * Initialize the logger with the storage capacity.
46
     * 
47
     * @param    {Number}
48
     *           The log stack capacity.
49
+    * @param    {boolean}
50
+    *           The boolean value that indicates the log is on/off.
51
     */
52
-   me.init = function(capacity)
53
+   me.init = function(capacity, on)
54
    {
55
       maxStackSize = capacity;
56
+      isOn = on;
57
    };
58
 
59
    /**
60
@@ -43,7 +49,10 @@
61
     */
62
    me.log = function(msg)
63
    {
64
-      save(msg);
65
+      if (isOn)
66
+      {
67
+         save(msg);
68
+      }
69
    };
70
    
71
    /*
72
@@ -56,19 +65,22 @@
73
     */
74
    me.logFormatted = function(format, parameters)
75
    {
76
-      save(format.split("%d").map(
77
-            function(currValue, index, arr)
78
-            {
79
-               if (this[index] === undefined)
80
+      if (isOn)
81
+      {
82
+         save(format.split("%d").map(
83
+               function(currValue, index, arr)
84
                {
85
-                  return currValue;
86
-               }
87
-               return currValue + this[index];
88
-            }, parameters).reduce(
89
-                  function(prevValue, currValue)
90
+                  if (this[index] === undefined)
91
                   {
92
-                     return prevValue + currValue;
93
-                  }, ""));
94
+                     return currValue;
95
+                  }
96
+                  return currValue + this[index];
97
+               }, parameters).reduce(
98
+                     function(prevValue, currValue)
99
+                     {
100
+                        return prevValue + currValue;
101
+                     }, ""));
102
+      }
103
    };
104
    
105
    /**
106

    
107
=== modified file 'src/com/goldencode/p2j/ui/client/driver/web/res/p2j.socket.js'
108
--- src/com/goldencode/p2j/ui/client/driver/web/res/p2j.socket.js	2015-11-26 10:46:59 +0000
109
+++ src/com/goldencode/p2j/ui/client/driver/web/res/p2j.socket.js	2015-11-27 23:55:23 +0000
110
@@ -417,501 +417,658 @@
111
                {
112
                   case 0x80:
113
                      // clear screen 
114
-                     p2j.screen.clear();                        
115
+                     setTimeout(
116
+                           function()
117
+                           {
118
+                              p2j.screen.clear();
119
+                           }, 1);
120
                      break;
121
                   case 0x81:
122
                      // draw screen
123
-                     var t1 = (new Date()).getTime();
124
-                     p2j.screen.drawRectangles(message);
125
-                     var t2 = (new Date()).getTime();
126
-                     // console.log("message: " + message.length + " done in " + (t2 - t1));
127
+                     document.body.className = p2j.waitCursorClass;
128
+                     var mobj = {message : message};
129
+                     setTimeout(
130
+                           function()
131
+                           {
132
+                              var t1 = (new Date()).getTime();
133
+                              p2j.screen.drawRectangles(mobj.message);
134
+                              var t2 = (new Date()).getTime();
135
+                              // console.log("message: " + message.length + " done in " + (t2 - t1));
136
+                           }, 1);
137
+                     setTimeout(
138
+                           function()
139
+                           {
140
+                              document.body.className = p2j.defaultBodyHtmlClass;
141
+                           }, 1);
142
                      break;
143
                   case 0x82:
144
                      // set cursor position
145
-                     p2j.screen.setCursorPosition(message[1], message[2]);                        
146
+                     var mobj = {message : message};
147
+                     setTimeout(
148
+                           function()
149
+                           {
150
+                              p2j.screen.setCursorPosition(mobj.message[1], mobj.message[2]);
151
+                           }, 1);
152
                      break;
153
                   case 0x83:
154
                      // show cursor
155
-                     p2j.screen.setCursorStatus(message[1]);                        
156
+                     var mobj = {message : message};
157
+                     setTimeout(
158
+                           function()
159
+                           {
160
+                              p2j.screen.setCursorStatus(mobj.message[1]);
161
+                           }, 1);
162
                      break;
163
                   case 0x84:
164
-                     // message beep
165
-                     p2j.sound.beep();                        
166
+                     var mobj = {message : message};
167
+                     setTimeout(
168
+                           function()
169
+                           {
170
+                              // message beep
171
+                              p2j.sound.beep();
172
+                           }, 1);
173
                      break;
174
                   case 0x85:
175
                      // quit
176
-                     window.location.replace(referrer);                        
177
+                     var mobj = {message : message};
178
+                     setTimeout(
179
+                           function()
180
+                           {
181
+                              window.location.replace(referrer);
182
+                           }, 1);
183
                      break;
184
                   case 0x86:
185
-                     // switch mode p2j/vt100
186
-                     p2j.keyboard.vt100 = (message[1] == 0) ? false : true;          
187
+                     var mobj = {message : message};
188
+                     setTimeout(
189
+                           function()
190
+                           {
191
+                              // switch mode p2j/vt100
192
+                              p2j.keyboard.vt100 = (mobj.message[1] == 0) ? false : true;
193
+                           }, 1);
194
                      break;
195
                   case 0x87:
196
-                     // server-driven request for clipboard contents
197
-                     p2j.clipboard.sendClipboardContents();          
198
+                     var mobj = {message : message};
199
+                     setTimeout(
200
+                           function()
201
+                           {
202
+                              // server-driven request for clipboard contents
203
+                              p2j.clipboard.sendClipboardContents();
204
+                           }, 1);
205
                      break;
206
                   case 0x88:
207
-                     // The clipboard is changed.
208
-                     var text = me.readStringBinaryMessage(message, 1);
209
-                     p2j.clipboard.writeClipboard(text);
210
+                     var mobj = {message : message};
211
+                     setTimeout(
212
+                           function()
213
+                           {
214
+                              // The clipboard is changed.
215
+                              var text = me.readStringBinaryMessage(mobj.message, 1);
216
+                              p2j.clipboard.writeClipboard(text);
217
+                           }, 1);
218
                      break;
219
                   case 0x89:
220
                      // create a top-level window with the given id
221
-                     var id = me.readInt32BinaryMessage(message, 1);
222
-                     p2j.screen.createWindow(id);
223
+                     var mobj = {message : message};
224
+                     setTimeout(
225
+                           function()
226
+                           {
227
+                              var id = me.readInt32BinaryMessage(mobj.message, 1);
228
+                              p2j.screen.createWindow(id);
229
+                           }, 1);
230
                      break;
231
                   case 0x8A:
232
                      // create a child window with the given id, owner and title
233
-                     var id    = me.readInt32BinaryMessage(message, 1);
234
-                     var owner = me.readInt32BinaryMessage(message, 5);
235
-                     var title = me.readStringBinaryMessage(message, 9);
236
-                     p2j.screen.createChildWindow(id, owner);
237
+                     var mobj = {message : message};
238
+                     setTimeout(
239
+                           function()
240
+                           {
241
+                              var id    = me.readInt32BinaryMessage(mobj.message, 1);
242
+                              var owner = me.readInt32BinaryMessage(mobj.message, 5);
243
+                              var title = me.readStringBinaryMessage(mobj.message, 9);
244
+                              p2j.screen.createChildWindow(id, owner);
245
+                           }, 1);
246
                      break;
247
                   case 0x8B:
248
                      // destroy top-level or child window
249
-                     var id = me.readInt32BinaryMessage(message, 1);
250
-                     var numberImages = me.readInt32BinaryMessage(message, 5);
251
-                     var images = [];
252
-                     for (var i = 0; i < numberImages; i++)
253
-                     {
254
-                        images[i] = me.readInt32BinaryMessage(message, 9 + (i * 4));
255
-                     }
256
-                     p2j.screen.destroyWindow(id, images);
257
+                     var mobj = {message : message};
258
+                     setTimeout(
259
+                           function()
260
+                           {
261
+                              var id = me.readInt32BinaryMessage(mobj.message, 1);
262
+                              var numberImages = me.readInt32BinaryMessage(mobj.message, 5);
263
+                              var images = [];
264
+                              for (var i = 0; i < numberImages; i++)
265
+                              {
266
+                                 images[i] = me.readInt32BinaryMessage(mobj.message, 9 + (i * 4));
267
+                              }
268
+                              p2j.screen.destroyWindow(id, images);
269
+                           }, 1);
270
                      break;
271
                   case 0x8C:
272
-                     // change visibility for top-level or child window
273
-                     var id = me.readInt32BinaryMessage(message, 1);
274
-                     var visible = message[5] === 0 ? false : true;
275
-                     p2j.screen.setWindowVisible(id, visible);
276
+                     var mobj = {message : message};
277
+                     setTimeout(
278
+                           function()
279
+                           {
280
+                              // change visibility for top-level or child window
281
+                              var id = me.readInt32BinaryMessage(mobj.message, 1);
282
+                              var visible = message[5] === 0 ? false : true;
283
+                              p2j.screen.setWindowVisible(id, visible);
284
+                           }, 1);
285
                      break;
286
                      
287
                   // font and metrics related requests
288
                   case 0x8D:
289
-                     // paragraph height
290
-                     
291
-                     var offset = 1;
292
-                     
293
-                     var msgId = me.readInt32BinaryMessage(message, offset);
294
-                     offset = offset + 4;
295
-                     
296
-                     var textLength = me.readInt32BinaryMessage(message, offset);
297
-                     offset = offset + 4;
298
-
299
-                     var text  = me.readStringBinaryMessageByLength(message, offset, textLength);
300
-                     offset = offset + textLength * 2;
301
-                     
302
-                     var font = me.readInt32BinaryMessage(message, offset);
303
-                     offset = offset + 4;
304
-
305
-                     var maxWidth = me.readInt16BinaryMessage(message, offset);
306
-                     offset = offset + 2;
307
-
308
-                     var pheight = p2j.screen.layoutParagraphWorker(null,
309
-                                                                    text,
310
-                                                                    font, 
311
-                                                                    0,
312
-                                                                    0, 
313
-                                                                    maxWidth);
314
-
315
-                     me.sendInt16BinaryMessage(0x06, msgId, pheight);
316
+                     var mobj = {message : message};
317
+                     setTimeout(
318
+                           function()
319
+                           {
320
+                              // paragraph height
321
+                              
322
+                              var offset = 1;
323
+                              
324
+                              var msgId = me.readInt32BinaryMessage(mobj.message, offset);
325
+                              offset = offset + 4;
326
+                              
327
+                              var textLength = me.readInt32BinaryMessage(mobj.message, offset);
328
+                              offset = offset + 4;
329
+         
330
+                              var text  = me.readStringBinaryMessageByLength(mobj.message, offset, textLength);
331
+                              offset = offset + textLength * 2;
332
+                              
333
+                              var font = me.readInt32BinaryMessage(mobj.message, offset);
334
+                              offset = offset + 4;
335
+         
336
+                              var maxWidth = me.readInt16BinaryMessage(mobj.message, offset);
337
+                              offset = offset + 2;
338
+         
339
+                              var pheight = p2j.screen.layoutParagraphWorker(null,
340
+                                                                             text,
341
+                                                                             font, 
342
+                                                                             0,
343
+                                                                             0, 
344
+                                                                             maxWidth);
345
+         
346
+                              me.sendInt16BinaryMessage(0x06, msgId, pheight);
347
+                           }, 1);
348
                      break;
349
                   case 0x8E:
350
-                     // text height
351
-                     
352
-                     var offset = 1;
353
-
354
-                     var msgId = me.readInt32BinaryMessage(message, offset);
355
-                     offset = offset + 4;
356
-                     
357
-                     var textLength = me.readInt32BinaryMessage(message, offset);
358
-                     offset = offset + 4;
359
-
360
-                     var text  = me.readStringBinaryMessageByLength(message, offset, textLength);
361
-                     offset = offset + textLength * 2;
362
-
363
-                     var font = me.readInt32BinaryMessage(message, offset);
364
-                     
365
-                     var theight = p2j.fonts.getTextHeight(font, text);
366
-
367
-                     me.sendInt8BinaryMessage(0x07, msgId, theight);
368
+                     var mobj = {message : message};
369
+                     setTimeout(
370
+                           function()
371
+                           {
372
+                              // text height
373
+                              
374
+                              var offset = 1;
375
+         
376
+                              var msgId = me.readInt32BinaryMessage(mobj.message, offset);
377
+                              offset = offset + 4;
378
+                              
379
+                              var textLength = me.readInt32BinaryMessage(mobj.message, offset);
380
+                              offset = offset + 4;
381
+         
382
+                              var text  = me.readStringBinaryMessageByLength(mobj.message, offset, textLength);
383
+                              offset = offset + textLength * 2;
384
+         
385
+                              var font = me.readInt32BinaryMessage(mobj.message, offset);
386
+                              
387
+                              var theight = p2j.fonts.getTextHeight(font, text);
388
+         
389
+                              me.sendInt8BinaryMessage(0x07, msgId, theight);
390
+                           }, 1);
391
                      break;
392
                   case 0x8F:
393
-                     // text width
394
-
395
-                     var offset = 1;
396
-                     
397
-                     var msgId = me.readInt32BinaryMessage(message, offset);
398
-                     offset = offset + 4;
399
-                     
400
-                     var textLength = me.readInt32BinaryMessage(message, offset);
401
-                     offset = offset + 4;
402
-
403
-                     var text  = me.readStringBinaryMessageByLength(message, offset, textLength);
404
-                     offset = offset + textLength * 2;
405
-
406
-                     var font = me.readInt32BinaryMessage(message, offset);
407
-                     offset = offset + 4;
408
-                     
409
-                     var twidth = p2j.fonts.getTextWidth(font, text);
410
-                     
411
-                     me.sendInt16BinaryMessage(0x08, msgId, twidth);
412
+                     var mobj = {message : message};
413
+                     setTimeout(
414
+                           function()
415
+                           {
416
+                              // text width
417
+         
418
+                              var offset = 1;
419
+                              
420
+                              var msgId = me.readInt32BinaryMessage(mobj.message, offset);
421
+                              offset = offset + 4;
422
+                              
423
+                              var textLength = me.readInt32BinaryMessage(mobj.message, offset);
424
+                              offset = offset + 4;
425
+         
426
+                              var text  = me.readStringBinaryMessageByLength(mobj.message, offset, textLength);
427
+                              offset = offset + textLength * 2;
428
+         
429
+                              var font = me.readInt32BinaryMessage(mobj.message, offset);
430
+                              offset = offset + 4;
431
+                              
432
+                              var twidth = p2j.fonts.getTextWidth(font, text);
433
+                              
434
+                              me.sendInt16BinaryMessage(0x08, msgId, twidth);
435
+                           }, 1);
436
                      break;
437
                   case 0x90:
438
-                     // font height
439
-
440
-                     var offset = 1;
441
-
442
-                     var msgId = me.readInt32BinaryMessage(message, offset);
443
-                     offset = offset + 4;
444
-
445
-                     var font = me.readInt32BinaryMessage(message, offset);
446
-                     offset = offset + 4;
447
-                     
448
-                     var fheight = p2j.fonts.getFontHeight(font);
449
-                     
450
-                     me.sendInt8BinaryMessage(0x09, msgId, fheight);
451
+                     var mobj = {message : message};
452
+                     setTimeout(
453
+                           function()
454
+                           {
455
+                              // font height
456
+         
457
+                              var offset = 1;
458
+         
459
+                              var msgId = me.readInt32BinaryMessage(mobj.message, offset);
460
+                              offset = offset + 4;
461
+         
462
+                              var font = me.readInt32BinaryMessage(mobj.message, offset);
463
+                              offset = offset + 4;
464
+                              
465
+                              var fheight = p2j.fonts.getFontHeight(font);
466
+                              
467
+                              me.sendInt8BinaryMessage(0x09, msgId, fheight);
468
+                           }, 1);
469
                      break;
470
                   case 0x91:
471
-                     // font widths
472
-
473
-                     var offset = 1;
474
-                     
475
-                     var msgId = me.readInt32BinaryMessage(message, offset);
476
-                     offset = offset + 4;
477
-                     
478
-                     var font = me.readInt32BinaryMessage(message, offset);
479
-                     offset = offset + 4;
480
-                     
481
-                     var fwidths = p2j.fonts.getFontWidths(font);
482
-                     
483
-                     me.sendByteArrayBinaryMessage(0x0A, msgId, fwidths);
484
+                     var mobj = {message : message};
485
+                     setTimeout(
486
+                           function()
487
+                           {
488
+                              // font widths
489
+         
490
+                              var offset = 1;
491
+                              
492
+                              var msgId = me.readInt32BinaryMessage(mobj.message, offset);
493
+                              offset = offset + 4;
494
+                              
495
+                              var font = me.readInt32BinaryMessage(mobj.message, offset);
496
+                              offset = offset + 4;
497
+                              
498
+                              var fwidths = p2j.fonts.getFontWidths(font);
499
+                              
500
+                              me.sendByteArrayBinaryMessage(0x0A, msgId, fwidths);
501
+                           }, 1);
502
                      break;
503
                   case 0x92:
504
-                     // create font
505
-
506
-                     var offset = 1;
507
-                     
508
-                     var msgId = me.readInt32BinaryMessage(message, offset);
509
-                     offset = offset + 4;
510
-                     
511
-                     var font = me.readInt32BinaryMessage(message, offset);
512
-                     offset = offset + 4;
513
-                     
514
-                     var nameLength = me.readInt16BinaryMessage(message, offset);
515
-                     offset = offset + 2;
516
-
517
-                     var name  = me.readStringBinaryMessageByLength(message, offset, nameLength);
518
-                     offset = offset + nameLength * 2;
519
-                     
520
-                     var size = message[offset];
521
-                     offset = offset + 1;
522
-                     
523
-                     var style = message[offset];
524
-                     offset = offset + 1;
525
-                     
526
-                     var defLength = me.readInt32BinaryMessage(message, offset);
527
-                     offset = offset + 4;
528
-                     
529
-                     var b64font = "";
530
-                     if (defLength > 0)
531
-                     {
532
-                        var binFont = '';
533
-                        for (var i = 0; i < defLength; i++)
534
-                        {
535
-                           binFont += String.fromCharCode(message[offset]);
536
-                           offset = offset + 1;
537
-                        }
538
-                        b64font = window.btoa(binFont);
539
-                     }
540
-
541
-                     var fontId = p2j.fonts.createFont(font, name, size, style, b64font);
542
-                     
543
-                     me.sendInt32BinaryMessage(0x0B, msgId, fontId);
544
+                     var mobj = {message : message};
545
+                     setTimeout(
546
+                           function()
547
+                           {
548
+                              // create font
549
+         
550
+                              var offset = 1;
551
+                              
552
+                              var msgId = me.readInt32BinaryMessage(mobj.message, offset);
553
+                              offset = offset + 4;
554
+                              
555
+                              var font = me.readInt32BinaryMessage(mobj.message, offset);
556
+                              offset = offset + 4;
557
+                              
558
+                              var nameLength = me.readInt16BinaryMessage(mobj.message, offset);
559
+                              offset = offset + 2;
560
+         
561
+                              var name  = me.readStringBinaryMessageByLength(mobj.message, offset, nameLength);
562
+                              offset = offset + nameLength * 2;
563
+                              
564
+                              var size = mobj.message[offset];
565
+                              offset = offset + 1;
566
+                              
567
+                              var style = mobj.message[offset];
568
+                              offset = offset + 1;
569
+                              
570
+                              var defLength = me.readInt32BinaryMessage(mobj.message, offset);
571
+                              offset = offset + 4;
572
+                              
573
+                              var b64font = "";
574
+                              if (defLength > 0)
575
+                              {
576
+                                 var binFont = '';
577
+                                 for (var i = 0; i < defLength; i++)
578
+                                 {
579
+                                    binFont += String.fromCharCode(mobj.message[offset]);
580
+                                    offset = offset + 1;
581
+                                 }
582
+                                 b64font = window.btoa(binFont);
583
+                              }
584
+         
585
+                              var fontId = p2j.fonts.createFont(font, name, size, style, b64font);
586
+                              
587
+                              me.sendInt32BinaryMessage(0x0B, msgId, fontId);
588
+                           }, 1);
589
                      break;
590
                   case 0x93:
591
-                     // derive font
592
-
593
-                     var offset = 1;
594
-                     
595
-                     var msgId = me.readInt32BinaryMessage(message, offset);
596
-                     offset = offset + 4;
597
-                     
598
-                     var font = me.readInt32BinaryMessage(message, offset);
599
-                     offset = offset + 4;
600
-
601
-                     p2j.fonts.deriveFont(font);
602
-                      
603
-                     me.sendInt8BinaryMessage(0x0C, msgId, 1);
604
+                     var mobj = {message : message};
605
+                     setTimeout(
606
+                           function()
607
+                           {
608
+                              // derive font
609
+         
610
+                              var offset = 1;
611
+                              
612
+                              var msgId = me.readInt32BinaryMessage(mobj.message, offset);
613
+                              offset = offset + 4;
614
+                              
615
+                              var font = me.readInt32BinaryMessage(mobj.message, offset);
616
+                              offset = offset + 4;
617
+         
618
+                              p2j.fonts.deriveFont(font);
619
+                               
620
+                              me.sendInt8BinaryMessage(0x0C, msgId, 1);
621
+                           }, 1);
622
                      break;
623
                   case 0x94:
624
-                     // set cursor style
625
-                     var styleId = me.readInt32BinaryMessage(message, 1);
626
-                     var wid = me.readInt32BinaryMessage(message, 5);
627
-                     p2j.screen.setCursorStyle(styleId, wid);
628
+                     var mobj = {message : message};
629
+                     setTimeout(
630
+                           function()
631
+                           {
632
+                              // set cursor style
633
+                              var styleId = me.readInt32BinaryMessage(mobj.message, 1);
634
+                              var wid = me.readInt32BinaryMessage(mobj.message, 5);
635
+                              p2j.screen.setCursorStyle(styleId, wid);
636
+                           }, 1);
637
                      break;
638
                   case 0x95:
639
-                     // restack windows
640
-                     var num = me.readInt32BinaryMessage(message, 1);
641
-                     var winids = [];
642
-                     for (var i = 0; i < num; i++)
643
-                     {
644
-                        winids.push(me.readInt32BinaryMessage(message, 5 + (i * 4)));
645
-                     }
646
-                     p2j.screen.restackZOrderEntries(winids);
647
+                     var mobj = {message : message};
648
+                     setTimeout(
649
+                           function()
650
+                           {
651
+                              // restack windows
652
+                              var num = me.readInt32BinaryMessage(mobj.message, 1);
653
+                              var winids = [];
654
+                              for (var i = 0; i < num; i++)
655
+                              {
656
+                                 winids.push(me.readInt32BinaryMessage(mobj.message, 5 + (i * 4)));
657
+                              }
658
+                              p2j.screen.restackZOrderEntries(winids);
659
+                           }, 1);
660
                      break;
661
                   case 0x96:
662
-                      // register/deregister widgets for mouse actions
663
-                      
664
-                      var offset = 1;
665
-                      
666
-                      // the number of windows with new widgets
667
-                      var windowNo = me.readInt16BinaryMessage(message, offset);
668
-                      offset = offset + 2;
669
-                      
670
-                      for (var j = 0; j < windowNo; j++)
671
-                      {
672
-                         // the window ID
673
-                         var windowID = me.readInt32BinaryMessage(message, offset);
674
-                         offset = offset + 4;
675
-                         
676
-                         if (!p2j.screen.isExistingWindowId(windowID))
677
-                         {
678
-                            console.log("undefined window " + windowID);
679
-                            continue;
680
-                         }
681
-                         
682
-                         var theWindow = p2j.screen.getWindow(windowID);
683
-                         
684
-                         // the number of new widgets in this window
685
-                         var widgetNo = me.readInt16BinaryMessage(message, offset);
686
-                         offset = offset + 2;
687
-                         
688
-                         for (var k = 0; k < widgetNo; k++)
689
-                         {
690
-                            // the widget ID
691
-                            var wid = me.readInt32BinaryMessage(message, offset);
692
-                            offset = offset + 4;
693
-
694
-                            // the coordinates
695
-                            var x = me.readInt16BinaryMessage(message, offset);
696
-                            offset = offset + 2;
697
-                            
698
-                            var y = me.readInt16BinaryMessage(message, offset);
699
-                            offset = offset + 2;
700
-            
701
-                            // the size
702
-                            var width = me.readInt16BinaryMessage(message, offset);
703
-                            offset = offset + 2;
704
-            
705
-                            var height = me.readInt16BinaryMessage(message, offset);
706
-                            offset = offset + 2;
707
-            
708
-                            // bit-encoded mouse ops: each bit from 1 to 11, if set, represents a mouse
709
-                            // operation as defined in p2j.screen.mouseOps
710
-                            var actions = me.readInt32BinaryMessage(message, offset);
711
-                            offset = offset + 4;
712
-                            theWindow.deregisterMouseWidget(wid);
713
-                            theWindow.registerMouseWidget(wid, x, y, width, height, actions);
714
-                         }
715
-                         
716
-                         var allWNo = me.readInt16BinaryMessage(message, offset);
717
-                         offset = offset + 2;
718
-                         var zOrder = [];
719
-                         
720
-                         for (var k = 0; k < allWNo; k++)
721
-                         {
722
-                           zOrder[k] = me.readInt32BinaryMessage(message, offset);
723
-                           offset = offset + 4;
724
-                         }
725
-                         
726
-                         theWindow.setWidgetZOrder(zOrder);
727
-                      }
728
-      
729
-                      // the number of windows with dead widgets
730
-                      windowNo = me.readInt16BinaryMessage(message, offset);
731
-                      offset = offset + 2;
732
-                      
733
-                      for (var j = 0; j < windowNo; j++)
734
-                      {
735
-                         // the window ID
736
-                         var windowID = me.readInt32BinaryMessage(message, offset);
737
-                         offset = offset + 4;
738
-                         
739
-                         var theWindow = p2j.screen.getWindow(windowID);
740
-                         
741
-                         if (theWindow == undefined)
742
-                         {
743
-                            console.log("undefined window" + windowID);
744
-                            continue;
745
-                         }
746
-                         
747
-                         // the number of dead widgets in this window
748
-                         var widgetNo = me.readInt16BinaryMessage(message, offset);
749
-                         offset = offset + 2;
750
-                         
751
-                         for (var k = 0; k < widgetNo; k++)
752
-                         {
753
-                            // the widget ID
754
-                            var wid = me.readInt32BinaryMessage(message, offset);
755
-                            offset = offset + 4;
756
-
757
-                            theWindow.deregisterMouseWidget(wid);
758
-                         }
759
-                      }
760
-
761
-                      // the number of windows with new "any widgets"
762
-                      windowNo = me.readInt16BinaryMessage(message, offset);
763
-                      offset = offset + 2;
764
-                      
765
-                      for (var j = 0; j < windowNo; j++)
766
-                      {
767
-                         // the window ID
768
-                         var windowID = me.readInt32BinaryMessage(message, offset);
769
-                         offset = offset + 4;
770
-                         
771
-                         if (!p2j.screen.isExistingWindowId(windowID))
772
-                         {
773
-                            console.log("undefined window " + windowID);
774
-                            continue;
775
-                         }
776
-                         
777
-                         var theWindow = p2j.screen.getWindow(windowID);
778
-                         
779
-                         // the number of new "any widgets" in this window
780
-                         var widgetNo = me.readInt16BinaryMessage(message, offset);
781
-                         offset = offset + 2;
782
-                         
783
-                         for (var k = 0; k < widgetNo; k++)
784
-                         {
785
-                            // the widget ID
786
-                            var wid = me.readInt32BinaryMessage(message, offset);
787
-                            offset = offset + 4;
788
-                            theWindow.deregisterAnyMouseWidget(wid);
789
-                            theWindow.registerAnyMouseWidget(wid);
790
-                         }
791
-                      }
792
-      
793
-                      // the number of windows with dead "any widgets"
794
-                      windowNo = me.readInt16BinaryMessage(message, offset);
795
-                      offset = offset + 2;
796
-                      
797
-                      for (var j = 0; j < windowNo; j++)
798
-                      {
799
-                         // the window ID
800
-                         var windowID = me.readInt32BinaryMessage(message, offset);
801
-                         offset = offset + 4;
802
-                         
803
-                         var theWindow = p2j.screen.getWindow(windowID);
804
-                         
805
-                         if (theWindow == undefined)
806
-                         {
807
-                            console.log("undefined window" + windowID);
808
-                            continue;
809
-                         }
810
-                         
811
-                         // the number of dead "any widgets" in this window
812
-                         var widgetNo = me.readInt16BinaryMessage(message, offset);
813
-                         offset = offset + 2;
814
-                         
815
-                         for (var k = 0; k < widgetNo; k++)
816
-                         {
817
-                            // the widget ID
818
-                            var wid = me.readInt32BinaryMessage(message, offset);
819
-                            offset = offset + 4;
820
-
821
-                            theWindow.deregisterAnyMouseWidget(wid);
822
-                         }
823
-                      }
824
-
825
+                     var mobj = {message : message};
826
+                     setTimeout(
827
+                           function()
828
+                           {
829
+                               // register/deregister widgets for mouse actions
830
+                               
831
+                               var offset = 1;
832
+                               
833
+                               // the number of windows with new widgets
834
+                               var windowNo = me.readInt16BinaryMessage(mobj.message, offset);
835
+                               offset = offset + 2;
836
+                               
837
+                               for (var j = 0; j < windowNo; j++)
838
+                               {
839
+                                  // the window ID
840
+                                  var windowID = me.readInt32BinaryMessage(mobj.message, offset);
841
+                                  offset = offset + 4;
842
+                                  
843
+                                  if (!p2j.screen.isExistingWindowId(windowID))
844
+                                  {
845
+                                     console.log("undefined window " + windowID);
846
+                                     continue;
847
+                                  }
848
+                                  
849
+                                  var theWindow = p2j.screen.getWindow(windowID);
850
+                                  
851
+                                  // the number of new widgets in this window
852
+                                  var widgetNo = me.readInt16BinaryMessage(mobj.message, offset);
853
+                                  offset = offset + 2;
854
+                                  
855
+                                  for (var k = 0; k < widgetNo; k++)
856
+                                  {
857
+                                     // the widget ID
858
+                                     var wid = me.readInt32BinaryMessage(mobj.message, offset);
859
+                                     offset = offset + 4;
860
+         
861
+                                     // the coordinates
862
+                                     var x = me.readInt16BinaryMessage(mobj.message, offset);
863
+                                     offset = offset + 2;
864
+                                     
865
+                                     var y = me.readInt16BinaryMessage(mobj.message, offset);
866
+                                     offset = offset + 2;
867
+                     
868
+                                     // the size
869
+                                     var width = me.readInt16BinaryMessage(mobj.message, offset);
870
+                                     offset = offset + 2;
871
+                     
872
+                                     var height = me.readInt16BinaryMessage(mobj.message, offset);
873
+                                     offset = offset + 2;
874
+                     
875
+                                     // bit-encoded mouse ops: each bit from 1 to 11, if set, represents a mouse
876
+                                     // operation as defined in p2j.screen.mouseOps
877
+                                     var actions = me.readInt32BinaryMessage(mobj.message, offset);
878
+                                     offset = offset + 4;
879
+                                     theWindow.deregisterMouseWidget(wid);
880
+                                     theWindow.registerMouseWidget(wid, x, y, width, height, actions);
881
+                                  }
882
+                                  
883
+                                  var allWNo = me.readInt16BinaryMessage(mobj.message, offset);
884
+                                  offset = offset + 2;
885
+                                  var zOrder = [];
886
+                                  
887
+                                  for (var k = 0; k < allWNo; k++)
888
+                                  {
889
+                                    zOrder[k] = me.readInt32BinaryMessage(mobj.message, offset);
890
+                                    offset = offset + 4;
891
+                                  }
892
+                                  
893
+                                  theWindow.setWidgetZOrder(zOrder);
894
+                               }
895
+               
896
+                               // the number of windows with dead widgets
897
+                               windowNo = me.readInt16BinaryMessage(mobj.message, offset);
898
+                               offset = offset + 2;
899
+                               
900
+                               for (var j = 0; j < windowNo; j++)
901
+                               {
902
+                                  // the window ID
903
+                                  var windowID = me.readInt32BinaryMessage(mobj.message, offset);
904
+                                  offset = offset + 4;
905
+                                  
906
+                                  var theWindow = p2j.screen.getWindow(windowID);
907
+                                  
908
+                                  if (theWindow == undefined)
909
+                                  {
910
+                                     console.log("undefined window" + windowID);
911
+                                     continue;
912
+                                  }
913
+                                  
914
+                                  // the number of dead widgets in this window
915
+                                  var widgetNo = me.readInt16BinaryMessage(mobj.message, offset);
916
+                                  offset = offset + 2;
917
+                                  
918
+                                  for (var k = 0; k < widgetNo; k++)
919
+                                  {
920
+                                     // the widget ID
921
+                                     var wid = me.readInt32BinaryMessage(mobj.message, offset);
922
+                                     offset = offset + 4;
923
+         
924
+                                     theWindow.deregisterMouseWidget(wid);
925
+                                  }
926
+                               }
927
+         
928
+                               // the number of windows with new "any widgets"
929
+                               windowNo = me.readInt16BinaryMessage(mobj.message, offset);
930
+                               offset = offset + 2;
931
+                               
932
+                               for (var j = 0; j < windowNo; j++)
933
+                               {
934
+                                  // the window ID
935
+                                  var windowID = me.readInt32BinaryMessage(mobj.message, offset);
936
+                                  offset = offset + 4;
937
+                                  
938
+                                  if (!p2j.screen.isExistingWindowId(windowID))
939
+                                  {
940
+                                     console.log("undefined window " + windowID);
941
+                                     continue;
942
+                                  }
943
+                                  
944
+                                  var theWindow = p2j.screen.getWindow(windowID);
945
+                                  
946
+                                  // the number of new "any widgets" in this window
947
+                                  var widgetNo = me.readInt16BinaryMessage(mobj.message, offset);
948
+                                  offset = offset + 2;
949
+                                  
950
+                                  for (var k = 0; k < widgetNo; k++)
951
+                                  {
952
+                                     // the widget ID
953
+                                     var wid = me.readInt32BinaryMessage(mobj.message, offset);
954
+                                     offset = offset + 4;
955
+                                     theWindow.deregisterAnyMouseWidget(wid);
956
+                                     theWindow.registerAnyMouseWidget(wid);
957
+                                  }
958
+                               }
959
+               
960
+                               // the number of windows with dead "any widgets"
961
+                               windowNo = me.readInt16BinaryMessage(mobj.message, offset);
962
+                               offset = offset + 2;
963
+                               
964
+                               for (var j = 0; j < windowNo; j++)
965
+                               {
966
+                                  // the window ID
967
+                                  var windowID = me.readInt32BinaryMessage(mobj.message, offset);
968
+                                  offset = offset + 4;
969
+                                  
970
+                                  var theWindow = p2j.screen.getWindow(windowID);
971
+                                  
972
+                                  if (theWindow == undefined)
973
+                                  {
974
+                                     console.log("undefined window" + windowID);
975
+                                     continue;
976
+                                  }
977
+                                  
978
+                                  // the number of dead "any widgets" in this window
979
+                                  var widgetNo = me.readInt16BinaryMessage(mobj.message, offset);
980
+                                  offset = offset + 2;
981
+                                  
982
+                                  for (var k = 0; k < widgetNo; k++)
983
+                                  {
984
+                                     // the widget ID
985
+                                     var wid = me.readInt32BinaryMessage(mobj.message, offset);
986
+                                     offset = offset + 4;
987
+         
988
+                                     theWindow.deregisterAnyMouseWidget(wid);
989
+                                  }
990
+                               }
991
+                           }, 1);
992
                       break;
993
                   case 0x97:
994
-                     // enable/disable mouse events
995
-                     p2j.screen.captureMouseEvents(message[1] == 1);
996
+                     var mobj = {message : message};
997
+                     setTimeout(
998
+                           function()
999
+                           {
1000
+                              // enable/disable mouse events
1001
+                              p2j.screen.captureMouseEvents(mobj.message[1] == 1);
1002
+                           }, 1);
1003
                      break;
1004
                   case 0x98:
1005
-                     // enable/disable OS events
1006
-                     var wid = me.readInt32BinaryMessage(message, 1);
1007
-                     p2j.screen.enableOsEvents(wid, message[5] == 1);
1008
+                     var mobj = {message : message};
1009
+                     setTimeout(
1010
+                           function()
1011
+                           {
1012
+                              // enable/disable OS events
1013
+                              var wid = me.readInt32BinaryMessage(mobj.message, 1);
1014
+                              p2j.screen.enableOsEvents(wid, mobj.message[5] == 1);
1015
+                           }, 1);
1016
                      break;
1017
                   case 0x99:
1018
-                     // set window iconification state
1019
-                     var offset = 1;
1020
-
1021
-                     var windowID = me.readInt32BinaryMessage(message, offset);
1022
-                     offset = offset + 4;
1023
-                     
1024
-                     var iconified = (message[offset] == 1);
1025
-                     offset = offset + 1;
1026
-                     
1027
-                     var theWindow = p2j.screen.getWindow(windowID);
1028
-                     //p2j.logger.log("recieved 0x99: iconified = " + iconified + " windowId=" + windowID);
1029
-                     if (iconified)
1030
-                     {
1031
-                        theWindow.iconify();
1032
-                     }
1033
-                     else
1034
-                     {
1035
-                        theWindow.deiconify();
1036
-                     }
1037
-
1038
+                     var mobj = {message : message};
1039
+                     setTimeout(
1040
+                           function()
1041
+                           {
1042
+                              // set window iconification state
1043
+                              var offset = 1;
1044
+         
1045
+                              var windowID = me.readInt32BinaryMessage(mobj.message, offset);
1046
+                              offset = offset + 4;
1047
+                              
1048
+                              var iconified = (mobj.message[offset] == 1);
1049
+                              offset = offset + 1;
1050
+                              
1051
+                              var theWindow = p2j.screen.getWindow(windowID);
1052
+                              //p2j.logger.log("recieved 0x99: iconified = " + iconified + " windowId=" + windowID);
1053
+                              if (iconified)
1054
+                              {
1055
+                                 theWindow.iconify();
1056
+                              }
1057
+                              else
1058
+                              {
1059
+                                 theWindow.deiconify();
1060
+                              }
1061
+                           }, 1);
1062
                      break;
1063
                   case 0x9A:
1064
-                     // resizeable window
1065
-                     var offset = 1;
1066
-                     
1067
-                     var windowID = me.readInt32BinaryMessage(message, offset);
1068
-                     offset = offset + 4;
1069
-                     
1070
-                     var theWindow = p2j.screen.getWindow(windowID);
1071
-
1072
-                     theWindow.resizeable = (message[offset] == 1);
1073
-                     offset = offset + 1;
1074
-                     
1075
-                     if (theWindow.resizeable)
1076
-                     {
1077
-                        theWindow.minWidth = me.readInt16BinaryMessage(message, offset);
1078
-                        offset = offset + 2;
1079
-                        theWindow.minHeight = me.readInt16BinaryMessage(message, offset);
1080
-                        offset = offset + 2;
1081
-                        
1082
-                        theWindow.maxWidth = me.readInt16BinaryMessage(message, offset);
1083
-                        offset = offset + 2;
1084
-                        theWindow.maxHeight = me.readInt16BinaryMessage(message, offset);
1085
-                        offset = offset + 2;
1086
-                     }
1087
-                     else
1088
-                     {
1089
-                        var rect = theWindow.canvas.getBoundingClientRect();
1090
-
1091
-                        var rwidth  = rect.right - rect.left + 1;
1092
-                        var rheight = rect.bottom - rect.top + 1;
1093
-                        
1094
-                        theWindow.minWidth = rwidth;
1095
-                        theWindow.minHeight = rheight;
1096
-
1097
-                        theWindow.maxWidth = rwidth;
1098
-                        theWindow.maxHeight = rheight;
1099
-                     }
1100
-                     
1101
+                     var mobj = {message : message};
1102
+                     setTimeout(
1103
+                           function()
1104
+                           {
1105
+                              // resizeable window
1106
+                              var offset = 1;
1107
+                              
1108
+                              var windowID = me.readInt32BinaryMessage(mobj.message, offset);
1109
+                              offset = offset + 4;
1110
+                              
1111
+                              var theWindow = p2j.screen.getWindow(windowID);
1112
+         
1113
+                              theWindow.resizeable = (mobj.message[offset] == 1);
1114
+                              offset = offset + 1;
1115
+                              
1116
+                              if (theWindow.resizeable)
1117
+                              {
1118
+                                 theWindow.minWidth = me.readInt16BinaryMessage(mobj.message, offset);
1119
+                                 offset = offset + 2;
1120
+                                 theWindow.minHeight = me.readInt16BinaryMessage(mobj.message, offset);
1121
+                                 offset = offset + 2;
1122
+                                 
1123
+                                 theWindow.maxWidth = me.readInt16BinaryMessage(mobj.message, offset);
1124
+                                 offset = offset + 2;
1125
+                                 theWindow.maxHeight = me.readInt16BinaryMessage(mobj.message, offset);
1126
+                                 offset = offset + 2;
1127
+                              }
1128
+                              else
1129
+                              {
1130
+                                 var rect = theWindow.canvas.getBoundingClientRect();
1131
+         
1132
+                                 var rwidth  = rect.right - rect.left + 1;
1133
+                                 var rheight = rect.bottom - rect.top + 1;
1134
+                                 
1135
+                                 theWindow.minWidth = rwidth;
1136
+                                 theWindow.minHeight = rheight;
1137
+         
1138
+                                 theWindow.maxWidth = rwidth;
1139
+                                 theWindow.maxHeight = rheight;
1140
+                              }
1141
+                           }, 1);
1142
                      break;
1143
                   case 0x9B:
1144
-                     // current editors selection is changed
1145
-                     var text = me.readStringBinaryMessage(message, 1);
1146
-                     p2j.clipboard.setSelection(text);
1147
+                     var mobj = {message : message};
1148
+                     setTimeout(
1149
+                           function()
1150
+                           {
1151
+                              // current editors selection is changed
1152
+                              var text = me.readStringBinaryMessage(mobj.message, 1);
1153
+                              p2j.clipboard.setSelection(text);
1154
+                           }, 1);
1155
                      break;
1156
                   case 0x9C:
1157
-                     var id = me.readInt32BinaryMessage(message, 1);
1158
-                     p2j.screen.moveToTop(id);
1159
+                     var mobj = {message : message};
1160
+                     setTimeout(
1161
+                           function()
1162
+                           {
1163
+                              var id = me.readInt32BinaryMessage(mobj.message, 1);
1164
+                              p2j.screen.moveToTop(id);
1165
+                           }, 1);
1166
                      break;
1167
                   case 0x9D:
1168
-                     var id = me.readInt32BinaryMessage(message, 1);
1169
-                     p2j.screen.moveToBottom(id);
1170
+                     var mobj = {message : message};
1171
+                     setTimeout(
1172
+                           function()
1173
+                           {
1174
+                              var id = me.readInt32BinaryMessage(mobj.message, 1);
1175
+                              p2j.screen.moveToBottom(id);
1176
+                           }, 1);
1177
                      break;
1178
                   case 0x9E:
1179
-                     // change sensitivity for top-level or child window
1180
-                     var id = me.readInt32BinaryMessage(message, 1);
1181
-                     var enabled  = message[5] === 0 ? false : true;
1182
-                     p2j.screen.setWindowEnabled(id, enabled);
1183
+                     var mobj = {message : message};
1184
+                     setTimeout(
1185
+                           function()
1186
+                           {
1187
+                              // change sensitivity for top-level or child window
1188
+                              var id = me.readInt32BinaryMessage(mobj.message, 1);
1189
+                              var enabled  = mobj.message[5] === 0 ? false : true;
1190
+                              p2j.screen.setWindowEnabled(id, enabled);
1191
+                           }, 1);
1192
                      break;
1193
                };
1194
             }
1195
@@ -924,7 +1081,7 @@
1196
                {
1197
                   case 0:
1198
                      // color palette
1199
-                     p2j.screen.palette = pay.p;                        
1200
+                     p2j.screen.palette = pay.p;
1201
                      break;
1202
                };
1203
             }
1204
@@ -945,7 +1102,7 @@
1205
             {
1206
                ws.close();
1207
             }
1208
-         };                  
1209
+         };
1210
       } 
1211
       else 
1212
       {
1213

    
1214
=== modified file 'src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.mouse.js'
1215
--- src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.mouse.js	2015-11-12 18:54:21 +0000
1216
+++ src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.mouse.js	2015-11-27 17:00:12 +0000
1217
@@ -534,8 +534,14 @@
1218
          {
1219
             return;
1220
          }
1221
-         // resize canvas
1222
+         // resize the offscreen canvas
1223
          win.resize(mThis.resizeArea.width, mThis.resizeArea.height);
1224
+         // set dimension for the window canvas
1225
+         win.canvas.width  = mThis.resizeArea.width;
1226
+         win.canvas.height = mThis.resizeArea.height;
1227
+         // blast the offscreen image to the window canvas
1228
+         win.ctx.drawImage(win.offscreenCanvas, 0, 0);
1229
+
1230
          // set new location
1231
          win.canvas.style.left = mThis.resizeArea.left + "px";
1232
          win.canvas.style.top  = mThis.resizeArea.top + "px";
1233

    
1234
=== modified file 'src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.screen.js'
1235
--- src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.screen.js	2015-11-24 19:25:52 +0000
1236
+++ src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.screen.js	2015-11-27 20:22:54 +0000
1237
@@ -337,8 +337,14 @@
1238
       
1239
       /** Backing canvas on which all output for this window will be rendered. */
1240
       this.canvas = p2j.createCanvas(null, options);
1241
+      this.canvas.style.visibility = "hidden";
1242
+
1243
       this.resizeable = false;
1244
-      
1245
+
1246
+      /** The off screen canvas to be used to make batch drawing. */
1247
+      this.offscreenCanvas = document.createElement('canvas');
1248
+      this.offscreenContext = this.offscreenCanvas.getContext('2d', {alpha : true});
1249
+
1250
       /** Canvas 2D graphics context. */
1251
       this.ctx = this.canvas.getContext('2d', {alpha : true});
1252
 
1253
@@ -355,7 +361,7 @@
1254
       this.iconHeight = 0;
1255
       
1256
       /** Creates canvas renderer. */
1257
-      this.canvasRenderer = new CanvasRenderer(this.canvas, this.ctx, strokesManager,
1258
+      this.canvasRenderer = new CanvasRenderer(this.offscreenCanvas, this.offscreenContext, strokesManager,
1259
              p2j.fonts, p2j.logger);
1260
       
1261
       /** 
1262
@@ -849,9 +855,9 @@
1263
       var numOps = p2j.socket.readInt32BinaryMessage(message, 5);
1264
                                    
1265
       p2j.logger.log("START DRAWING CYCLE FOR WINDOW " + this.id);
1266
-      
1267
+
1268
       var idx = 9;
1269
-      
1270
+
1271
       drawLoop:
1272
       for (var i = 0; i < numOps; i++)
1273
       {
1274
@@ -904,7 +910,6 @@
1275
 
1276
                y = p2j.socket.readInt32BinaryMessage(message, idx + offset);
1277
                offset = offset + 4;
1278
-
1279
                this.canvasRenderer.drawText(text, x, y, centered);
1280
                extra = " text = " + text + "; x = " + x + "; y = " + y +
1281
                        "; centered = " + centered;
1282
@@ -932,7 +937,6 @@
1283
 
1284
                var lheight = p2j.socket.readInt32BinaryMessage(message, idx + offset);
1285
                offset = offset + 4;
1286
-               
1287
                this.canvasRenderer.drawScaledText(currentFont, text, x, y, centered, lwidth, lheight);
1288
                extra = " text = " + text + "; x = " + x + "; y = " + y +
1289
                        "; centered = " + centered +
1290
@@ -960,9 +964,8 @@
1291
                offset = offset + 4;
1292
 
1293
                // TODO: this might need to be 'bottom', too
1294
-               this.ctx.textBaseline = 'top';
1295
-
1296
-               me.layoutParagraphWorker(this.ctx, text, fontId, x, y, width);
1297
+               this.offscreenContext.textBaseline = 'top';
1298
+               me.layoutParagraphWorker(this.offscreenContext, text, fontId, x, y, width);
1299
 
1300
                break;
1301
             case ops.DRAW_LINE:
1302
@@ -971,7 +974,8 @@
1303
                var x2 =  p2j.socket.readInt32BinaryMessage(message, idx + 9);
1304
                var y2 =  p2j.socket.readInt32BinaryMessage(message, idx + 13);
1305
                extra = " x1 = " + x1 + "; y1 = " + y1 + "; x2 = " + x2 + "; y2 = " + y2;
1306
-               this.canvasRenderer.strokeLineSegment(this.ctx, x1, y1, x2, y2, this.canvasRenderer.rawColor);
1307
+               this.canvasRenderer.strokeLineSegment(this.offscreenContext,
1308
+                     x1, y1, x2, y2, this.canvasRenderer.rawColor);
1309
                break;
1310
             case ops.DRAW_RECT:
1311
             case ops.FILL_RECT:
1312
@@ -979,9 +983,9 @@
1313
                y      = p2j.socket.readInt32BinaryMessage(message, idx + 5);
1314
                width  = p2j.socket.readInt32BinaryMessage(message, idx + 9);
1315
                height = p2j.socket.readInt32BinaryMessage(message, idx + 13);
1316
+               filled = (type === ops.FILL_RECT);
1317
                extra  = " x = " + x + "; y = " + y + "; width = " + width + "; height = " + height;
1318
-               filled = (type === ops.FILL_RECT);
1319
-               this.canvasRenderer.strokeRect(this.ctx, x, y, width, height,
1320
+               this.canvasRenderer.strokeRect(this.offscreenContext, x, y, width, height,
1321
                      this.canvasRenderer.rawColor, filled);
1322
                break;
1323
             case ops.DRAW_ROUND_RECT:
1324
@@ -991,8 +995,9 @@
1325
                height   = p2j.socket.readInt32BinaryMessage(message, idx + 13);
1326
                diameter = p2j.socket.readInt32BinaryMessage(message, idx + 17);
1327
                extra = " x = " + x + "; y = " + y + "; width = " + width + "; height = " + height
1328
-                        + "; diameter = " + diameter;
1329
-               this.canvasRenderer.drawRoundRect(this.ctx, x, y, width, height, diameter,
1330
+                  + "; diameter = " + diameter;
1331
+               this.canvasRenderer.drawRoundRect(this.offscreenContext, x, y,
1332
+                     width, height, diameter,
1333
                      this.canvasRenderer.rawColor, false);
1334
                break;
1335
             case ops.DRAW_IMAGE:
1336
@@ -1003,7 +1008,6 @@
1337
                height = p2j.socket.readInt32BinaryMessage(message, idx + 13);
1338
 
1339
                extra = " x = " + x + "; y = " + y + "; width = " + width + "; height = " + height;
1340
-               
1341
                var encoding = message[idx + 17];
1342
                var key = p2j.socket.readInt32BinaryMessage(message, idx + 18);
1343
                var pixelsInBytes = width * height * 4;
1344
@@ -1018,9 +1022,11 @@
1345
                {
1346
                   imgData = message;
1347
                   imgDataOffset = idx + 22;
1348
-                  loadedImages.set(key, message.subarray(imgDataOffset, imgDataOffset + pixelsInBytes));
1349
+                  loadedImages.set(key, message.subarray(
1350
+                        imgDataOffset, imgDataOffset + pixelsInBytes));
1351
                }
1352
-               this.canvasRenderer.drawImage(this.ctx, x, y, width, height, imgData, imgDataOffset);
1353
+               this.canvasRenderer.drawImage(this.offscreenContext, x, y, width, height,
1354
+                     imgData, imgDataOffset);
1355
                break;
1356
             case ops.FILL_ROUND_RECT:
1357
                x        = p2j.socket.readInt32BinaryMessage(message, idx + 1);
1358
@@ -1030,13 +1036,12 @@
1359
                diameter = p2j.socket.readInt32BinaryMessage(message, idx + 17);
1360
                extra = " x = " + x + "; y = " + y + "; width = " + width + "; height = " + height
1361
                         + "; diameter = " + diameter;
1362
-               this.canvasRenderer.drawRoundRect(this.ctx, x, y, width, height, diameter,
1363
-                     this.canvasRenderer.rawColor, true);
1364
+               this.canvasRenderer.drawRoundRect(this.offscreenContext, x, y, width, height,
1365
+                     diameter, this.canvasRenderer.rawColor, true);
1366
                break;
1367
             case ops.FILL_POLYGON:
1368
                offset = idx + 1;
1369
                var numPoints = p2j.socket.readInt32BinaryMessage(message, offset);
1370
-               
1371
                var xPoints = [];
1372
                var yPoints = [];
1373
                
1374
@@ -1048,8 +1053,8 @@
1375
                   yPoints[j] = p2j.socket.readInt32BinaryMessage(message, offset);
1376
                }
1377
                
1378
-               this.canvasRenderer.strokePolygon(this.ctx, xPoints, yPoints, numPoints,
1379
-                     this.canvasRenderer.rawColor, true);
1380
+               this.canvasRenderer.strokePolygon(this.offscreenContext, xPoints, yPoints,
1381
+                     numPoints, this.canvasRenderer.rawColor, true);
1382
                break;
1383
             case ops.DRAW_3D_RECT:
1384
             case ops.FILL_3D_RECT:
1385
@@ -1060,8 +1065,8 @@
1386
                raised = (message[idx + 17] === 1);
1387
                filled = (type == ops.FILL_3D_RECT);
1388
                extra = " x = " + x +"; y = " + y + "; width = " + width + "; height = " +
1389
-                       height + "; raised = " + raised;
1390
-               this.canvasRenderer.draw3DRect(this.ctx, x, y, width, height,
1391
+                        height + "; raised = " + raised;
1392
+               this.canvasRenderer.draw3DRect(this.offscreenContext, x, y, width, height,
1393
                      this.canvasRenderer.rawColor, filled, raised);
1394
                break;
1395
             case ops.SET_COLOR:
1396
@@ -1079,22 +1084,21 @@
1397
                break;              
1398
             case ops.SET_FONT:
1399
                fontId = p2j.socket.readInt32BinaryMessage(message, idx + 1);
1400
-
1401
-               setFont(this.ctx, fontId);
1402
+               setFont(this.offscreenContext, fontId);
1403
                break;
1404
             case ops.SET_FONT_STYLE:
1405
                var style = p2j.socket.readInt32BinaryMessage(message, idx + 1);
1406
-               
1407
                p2j.fonts.setFontStyle(currentFont, style);
1408
                fname = p2j.fonts.getFontName(currentFont);
1409
-               this.ctx.font = fname;
1410
+               this.offscreenContext.font = fname;
1411
                break;
1412
             case ops.TRANSLATE_PUSH:                                                   
1413
                x =  p2j.socket.readInt32BinaryMessage(message, idx + 1);
1414
                y =  p2j.socket.readInt32BinaryMessage(message, idx + 5);
1415
                this.trans++;
1416
-               extra = " " + this.trans.toString() + "; x = " + x.toString() +"; y = " + y.toString();
1417
-               this.canvasRenderer.translate(x, y);  
1418
+               extra = " " + this.trans.toString() + "; x = " + x.toString()
1419
+                     + "; y = " + y.toString();
1420
+               this.canvasRenderer.translate(x, y);
1421
                break;
1422
             case ops.TRANSLATE_POP:                                                   
1423
                x =  p2j.socket.readInt32BinaryMessage(message, idx + 1);
1424
@@ -1129,6 +1133,9 @@
1425
                width  = p2j.socket.readInt32BinaryMessage(message, idx + 9);
1426
                height = p2j.socket.readInt32BinaryMessage(message, idx + 13);
1427
                this.resize(width, height);
1428
+               this.canvas.width  = width;
1429
+               this.canvas.height = height;
1430
+
1431
                extra = " x = " + x + "; y = " + y + "; width = " + width + "; height = " + height;
1432
                break;
1433
             case ops.SET_LOCATION:
1434
@@ -1142,6 +1149,8 @@
1435
                width  = p2j.socket.readInt32BinaryMessage(message, idx + 1);
1436
                height = p2j.socket.readInt32BinaryMessage(message, idx + 5);
1437
                this.resize(width, height);
1438
+               this.canvas.width  = width;
1439
+               this.canvas.height = height;
1440
                extra = " width = " + width + "; height = " + height;
1441
                break;
1442
             case ops.DRAW_HIGHLIGHT:
1443
@@ -1207,7 +1216,8 @@
1444
          p2j.logger.log("PaintPrimitives." + ops[type] + " " + extra);
1445
          idx += sz;
1446
       }
1447
-      
1448
+      // to blast the offscreen image on the window canvas
1449
+      this.ctx.drawImage(this.offscreenCanvas, 0, 0);
1450
       p2j.logger.log("END DRAWING CYCLE FOR WINDOW " + this.id);
1451
    }; 
1452
 
1453