@@ -51,6 +51,17 @@ var _move = {
51
51
prev_y : 0
52
52
}
53
53
54
+ //Provides: _resize
55
+ //Requires: _resize_handler
56
+ var _resize = new window . ResizeObserver ( _resize_handler ) ;
57
+
58
+ //Provides: _event_canvas_scale
59
+ function _event_canvas_scale ( e ) {
60
+ return { scaleX : e . target . canvas . width / e . target . clientWidth ,
61
+ scaleY : e . target . canvas . height / e . target . clientHeight
62
+ }
63
+ }
64
+
54
65
//Provides: _make_key_event
55
66
//Requires: _focus, keyname_to_keycode, Val_key_code, Val_key_state, EVENT_TAG
56
67
//Requires: caml_int64_of_float
@@ -108,44 +119,46 @@ function _header_down_handler(e) {
108
119
_move . target = e . target . canvas . frame ;
109
120
_move . prev_x = e . pageX ;
110
121
_move . prev_y = e . pageY ;
111
- document . body . insertBefore ( _move . target , null ) ;
122
+ e . target . canvas . target . insertBefore ( _move . target , null ) ;
112
123
}
113
124
return false ;
114
125
}
115
126
116
127
//Provides: _surface_down_handler
117
- //Requires: _focus, _ml_canvas_process_event, EVENT_TAG
128
+ //Requires: _focus, _ml_canvas_process_event, _event_canvas_scale, EVENT_TAG
118
129
//Requires: caml_int64_of_float
119
130
function _surface_down_handler ( e ) {
120
131
if ( e . target !== null ) {
121
132
_focus = e . target . canvas ;
122
- document . body . insertBefore ( e . target . canvas . frame , null ) ;
133
+ e . target . canvas . target . insertBefore ( e . target . canvas . frame , null ) ;
134
+ var s = _event_canvas_scale ( e ) ;
123
135
var evt = [ EVENT_TAG . BUTTON_ACTION ,
124
136
[ 0 , e . target . canvas ,
125
137
caml_int64_of_float ( e . timeStamp * 1000.0 ) ,
126
- [ 0 , e . offsetX , e . offsetY ] , e . button + 1 , 1 ] ] ;
138
+ [ 0 , e . offsetX * s . scaleX , e . offsetY * s . scaleY ] , e . button + 1 , 1 ] ] ;
127
139
_ml_canvas_process_event ( evt ) ;
128
140
}
129
141
return false ;
130
142
}
131
143
132
144
//Provides: _up_handler
133
- //Requires: _move, _ml_canvas_process_event, EVENT_TAG
145
+ //Requires: _move, _ml_canvas_process_event, _event_canvas_scale, EVENT_TAG
134
146
//Requires: caml_int64_of_float
135
147
function _up_handler ( e ) {
136
148
_move . moving = false ;
137
149
if ( e . target . canvas !== undefined ) {
150
+ var s = _event_canvas_scale ( e ) ;
138
151
var evt = [ EVENT_TAG . BUTTON_ACTION ,
139
152
[ 0 , e . target . canvas ,
140
153
caml_int64_of_float ( e . timeStamp * 1000.0 ) ,
141
- [ 0 , e . offsetX , e . offsetY ] , e . button + 1 , 0 ] ] ;
154
+ [ 0 , e . offsetX * s . scaleX , e . offsetY * s . scaleY ] , e . button + 1 , 0 ] ] ;
142
155
_ml_canvas_process_event ( evt ) ;
143
156
}
144
157
return false ; // = prevent default behavior
145
158
}
146
159
147
160
//Provides: _move_handler
148
- //Requires: _move, _ml_canvas_process_event, EVENT_TAG
161
+ //Requires: _move, _ml_canvas_process_event, _event_canvas_scale, EVENT_TAG
149
162
//Requires: caml_int64_of_float
150
163
function _move_handler ( e ) {
151
164
if ( _move . moving ) {
@@ -161,15 +174,30 @@ function _move_handler(e) {
161
174
_move . target . style . left = canvas . x + "px" ;
162
175
_move . target . style . top = canvas . y + "px" ;
163
176
} else if ( e . target . canvas !== undefined ) {
177
+ var s = _event_canvas_scale ( e ) ;
164
178
var evt = [ EVENT_TAG . MOUSE_MOVE ,
165
179
[ 0 , e . target . canvas ,
166
180
caml_int64_of_float ( e . timeStamp * 1000.0 ) ,
167
- [ 0 , e . offsetX , e . offsetY ] ] ] ;
181
+ [ 0 , e . offsetX * s . scaleX , e . offsetY * s . scaleY ] ] ] ;
168
182
_ml_canvas_process_event ( evt ) ;
169
183
}
170
184
return false ;
171
185
}
172
186
187
+ //Provides: _resize_handler
188
+ //Requires: _ml_canvas_process_event, EVENT_TAG
189
+ //Requires: caml_int64_of_float
190
+ function _resize_handler ( entries ) {
191
+ entries . forEach ( function ( e ) {
192
+ var evt = [ EVENT_TAG . CANVAS_RESIZED ,
193
+ [ 0 , e . target . canvas ,
194
+ caml_int64_of_float ( e . timeStamp * 1000.0 ) ,
195
+ [ 0 , e . target . clientWidth , e . target . clientHeight ] ] ] ;
196
+ _ml_canvas_process_event ( evt ) ;
197
+ } ) ;
198
+ return false ;
199
+ }
200
+
173
201
//Provides: _frame_handler
174
202
//Requires: _ml_canvas_process_event, EVENT_TAG
175
203
//Requires: caml_int64_of_float
@@ -588,7 +616,7 @@ var _next_id = 0;
588
616
589
617
//Provides: _ml_canvas_decorate
590
618
//Requires: caml_jsstring_of_string
591
- function _ml_canvas_decorate ( header , resizeable , minimize ,
619
+ function _ml_canvas_decorate ( header , minimize ,
592
620
maximize , close , title ) {
593
621
var width = header . width ;
594
622
var ctxt = header . getContext ( "2d" ) ;
@@ -613,10 +641,11 @@ function _ml_canvas_decorate(header, resizeable, minimize,
613
641
}
614
642
615
643
//Provides: ml_canvas_create_onscreen
616
- //Requires: _ml_canvas_ensure_initialized, _ml_canvas_valid_canvas_size, _next_id, _header_down_handler, _surface_down_handler, _up_handler, _move_handler, _ml_canvas_decorate, Optional_bool_val, Optional_val
644
+ //Requires: _ml_canvas_ensure_initialized, _ml_canvas_valid_canvas_size, _resize, _next_id, _header_down_handler
645
+ //Requires: _surface_down_handler, _up_handler, _move_handler, _ml_canvas_decorate, Optional_bool_val, Optional_val
617
646
//Requires: caml_invalid_argument
618
- function ml_canvas_create_onscreen ( autocmmit , decorated , resizeable , minimize ,
619
- maximize , close , title , pos , size ) {
647
+ function ml_canvas_create_onscreen ( autocommit , decorated , resizeable , minimize ,
648
+ maximize , close , title , target , pos , size ) {
620
649
621
650
_ml_canvas_ensure_initialized ( ) ;
622
651
@@ -631,17 +660,23 @@ function ml_canvas_create_onscreen(autocmmit, decorated, resizeable, minimize,
631
660
var y = pos [ 2 ] ;
632
661
633
662
var autocommit = Optional_bool_val ( autocommit , true ) ;
634
- var decorated = Optional_bool_val ( decorated , true ) ;
663
+ var decorated = false ; // Optional_bool_val(decorated, true);
635
664
var resizeable = Optional_bool_val ( resizeable , true ) ;
636
665
var minimize = Optional_bool_val ( minimize , true ) ;
637
666
var maximize = Optional_bool_val ( maximize , true ) ;
638
667
var close = Optional_bool_val ( close , true ) ;
639
668
var title = Optional_val ( title , null ) ;
669
+ var target = Optional_val ( target , null ) ;
670
+ target = document . getElementById ( target ) ;
671
+ if ( target == null ) {
672
+ target = document . body ;
673
+ }
640
674
641
675
var id = ++ _next_id ;
642
676
643
677
var canvas = {
644
678
name : title ,
679
+ target : target ,
645
680
frame : null ,
646
681
header : null ,
647
682
surface : null ,
@@ -661,16 +696,18 @@ function ml_canvas_create_onscreen(autocmmit, decorated, resizeable, minimize,
661
696
662
697
var frame = document . createElement ( "div" ) ;
663
698
frame . id = "f" + id ;
664
- frame . style . width = width + "px" ;
665
- frame . style . height = height + header_height + "px" ;
699
+ if ( resizeable == true ) {
700
+ frame . style . width = "100%" ;
701
+ frame . style . height = "100%" ;
702
+ } else {
703
+ frame . style . width = width + "px" ;
704
+ frame . style . height = height + header_height + "px" ;
705
+ }
666
706
frame . style . visibility = "hidden" ;
667
- frame . style . position = "absolute" ;
668
- frame . style . left = x + "px" ;
669
- frame . style . top = y + "px" ;
670
707
frame . oncontextmenu = function ( ) { return false ; }
671
708
frame . canvas = canvas ;
672
709
canvas . frame = frame ;
673
- document . body . appendChild ( frame ) ;
710
+ target . appendChild ( frame ) ;
674
711
675
712
var header = null ;
676
713
if ( decorated === true ) {
@@ -679,8 +716,7 @@ function ml_canvas_create_onscreen(autocmmit, decorated, resizeable, minimize,
679
716
header . id = "h" + id ;
680
717
header . width = width ;
681
718
header . height = 30 ;
682
- header . style . position = "absolute" ;
683
- _ml_canvas_decorate ( header , resizeable , minimize , maximize , close , title ) ;
719
+ _ml_canvas_decorate ( header , minimize , maximize , close , title ) ;
684
720
header . onmousedown = _header_down_handler ;
685
721
header . canvas = canvas ;
686
722
canvas . header = header ;
@@ -691,13 +727,17 @@ function ml_canvas_create_onscreen(autocmmit, decorated, resizeable, minimize,
691
727
surface . id = "s" + id ;
692
728
surface . width = width ;
693
729
surface . height = height ;
694
- surface . style . position = "absolute"
695
- surface . style . top = header_height + "px" ;
696
730
surface . onmousedown = _surface_down_handler ;
697
731
surface . canvas = canvas ;
698
732
canvas . surface = surface ;
699
733
frame . appendChild ( surface ) ;
700
734
735
+ if ( resizeable === true ) {
736
+ surface . style . width = "100%" ;
737
+ surface . style . height = "100%" ;
738
+ _resize . observe ( surface ) ;
739
+ }
740
+
701
741
var ctxt = surface . getContext ( "2d" ) ;
702
742
ctxt . globalAlpha = 1.0 ;
703
743
ctxt . lineWidth = 1.0 ;
@@ -907,7 +947,7 @@ function ml_canvas_set_size(canvas, size) {
907
947
var img = canvas . ctxt . getImageData ( 0 , 0 , canvas . width , canvas . height ) ;
908
948
if ( canvas . header !== null ) {
909
949
canvas . header . width = width ;
910
- _ml_canvas_decorate ( canvas . header , canvas . resizeable , canvas . minimize ,
950
+ _ml_canvas_decorate ( canvas . header , canvas . minimize ,
911
951
canvas . maximize , canvas . close , canvas . name ) ;
912
952
}
913
953
canvas . surface . width = canvas . width = width ;
@@ -1551,16 +1591,16 @@ function ml_canvas_key_of_int(keycode) {
1551
1591
/* Backend */
1552
1592
1553
1593
//Provides: ml_canvas_init
1554
- //Requires: _key_down_handler, _key_up_handler, _up_handler, _move_handler, _frame_handler, _ml_canvas_initialized
1555
- //Requires: caml_list_to_js_array
1594
+ //Requires: _key_down_handler, _key_up_handler, _up_handler, _move_handler, _resize_handler, _frame_handler
1595
+ //Requires: _ml_canvas_initialized, caml_list_to_js_array
1556
1596
function ml_canvas_init ( ) {
1557
1597
if ( _ml_canvas_initialized === true ) {
1558
1598
return 0 ;
1559
1599
}
1560
- document . onkeydown = _key_down_handler ;
1561
- document . onkeyup = _key_up_handler ;
1562
- document . onmouseup = _up_handler ;
1563
- document . onmousemove = _move_handler ;
1600
+ document . addEventListener ( "keydown" , _key_down_handler , { passive : true } ) ;
1601
+ document . addEventListener ( "keyup" , _key_up_handler , { passive : true } ) ;
1602
+ document . addEventListener ( "mouseup" , _up_handler , { passive : true } ) ;
1603
+ document . addEventListener ( "mousemove" , _move_handler , { passive : true } ) ;
1564
1604
window . requestAnimationFrame ( _frame_handler ) ;
1565
1605
_ml_canvas_initialized = true ;
1566
1606
return 0 ;
0 commit comments