33 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
44
55use crate :: canvas_data:: * ;
6+ use crate :: ConstellationCanvasMsg ;
67use canvas_traits:: canvas:: * ;
8+ use crossbeam_channel:: { select, unbounded, Sender } ;
79use euclid:: default:: Size2D ;
810use ipc_channel:: ipc:: { self , IpcSender } ;
11+ use ipc_channel:: router:: ROUTER ;
912use std:: borrow:: ToOwned ;
1013use std:: collections:: HashMap ;
1114use std:: thread;
@@ -30,53 +33,69 @@ impl<'a> CanvasPaintThread<'a> {
3033
3134 /// Creates a new `CanvasPaintThread` and returns an `IpcSender` to
3235 /// communicate with it.
33- pub fn start ( ) -> IpcSender < CanvasMsg > {
34- let ( sender, receiver) = ipc:: channel :: < CanvasMsg > ( ) . unwrap ( ) ;
36+ pub fn start ( ) -> ( Sender < ConstellationCanvasMsg > , IpcSender < CanvasMsg > ) {
37+ let ( ipc_sender, ipc_receiver) = ipc:: channel :: < CanvasMsg > ( ) . unwrap ( ) ;
38+ let msg_receiver = ROUTER . route_ipc_receiver_to_new_crossbeam_receiver ( ipc_receiver) ;
39+ let ( create_sender, create_receiver) = unbounded ( ) ;
3540 thread:: Builder :: new ( )
3641 . name ( "CanvasThread" . to_owned ( ) )
3742 . spawn ( move || {
3843 let mut canvas_paint_thread = CanvasPaintThread :: new ( ) ;
3944 loop {
40- match receiver. recv ( ) {
41- Ok ( msg) => match msg {
42- CanvasMsg :: Canvas2d ( message, canvas_id) => {
43- canvas_paint_thread. process_canvas_2d_message ( message, canvas_id) ;
44- } ,
45- CanvasMsg :: Close ( canvas_id) => {
46- canvas_paint_thread. canvases . remove ( & canvas_id) ;
47- } ,
48- CanvasMsg :: Create ( creator, size, webrenderer_api_sender, antialias) => {
49- let canvas_id = canvas_paint_thread. create_canvas (
45+ select ! {
46+ recv( msg_receiver) -> msg => {
47+ match msg {
48+ Ok ( CanvasMsg :: Canvas2d ( message, canvas_id) ) => {
49+ canvas_paint_thread. process_canvas_2d_message( message, canvas_id) ;
50+ } ,
51+ Ok ( CanvasMsg :: Close ( canvas_id) ) => {
52+ canvas_paint_thread. canvases. remove( & canvas_id) ;
53+ } ,
54+ Ok ( CanvasMsg :: Recreate ( size, canvas_id) ) => {
55+ canvas_paint_thread. canvas( canvas_id) . recreate( size) ;
56+ } ,
57+ Ok ( CanvasMsg :: FromScript ( message, canvas_id) ) => match message {
58+ FromScriptMsg :: SendPixels ( chan) => {
59+ canvas_paint_thread. canvas( canvas_id) . send_pixels( chan) ;
60+ } ,
61+ } ,
62+ Ok ( CanvasMsg :: FromLayout ( message, canvas_id) ) => match message {
63+ FromLayoutMsg :: SendData ( chan) => {
64+ canvas_paint_thread. canvas( canvas_id) . send_data( chan) ;
65+ } ,
66+ } ,
67+ Err ( e) => {
68+ warn!( "Error on CanvasPaintThread receive ({})" , e) ;
69+ } ,
70+ }
71+ }
72+ recv( create_receiver) -> msg => {
73+ match msg {
74+ Ok ( ConstellationCanvasMsg :: Create {
75+ id_sender: creator,
5076 size,
51- webrenderer_api_sender,
52- antialias,
53- ) ;
54- creator. send ( canvas_id) . unwrap ( ) ;
55- } ,
56- CanvasMsg :: Recreate ( size, canvas_id) => {
57- canvas_paint_thread. canvas ( canvas_id) . recreate ( size) ;
58- } ,
59- CanvasMsg :: FromScript ( message, canvas_id) => match message {
60- FromScriptMsg :: SendPixels ( chan) => {
61- canvas_paint_thread. canvas ( canvas_id) . send_pixels ( chan) ;
77+ webrender_sender: webrenderer_api_sender,
78+ antialias
79+ } ) => {
80+ let canvas_id = canvas_paint_thread. create_canvas(
81+ size,
82+ webrenderer_api_sender,
83+ antialias,
84+ ) ;
85+ creator. send( canvas_id) . unwrap( ) ;
6286 } ,
63- } ,
64- CanvasMsg :: FromLayout ( message, canvas_id) => match message {
65- FromLayoutMsg :: SendData ( chan) => {
66- canvas_paint_thread. canvas ( canvas_id) . send_data ( chan) ;
87+ Ok ( ConstellationCanvasMsg :: Exit ) => break ,
88+ Err ( e) => {
89+ warn!( "Error on CanvasPaintThread receive ({})" , e) ;
6790 } ,
68- } ,
69- CanvasMsg :: Exit => break ,
70- } ,
71- Err ( e) => {
72- warn ! ( "Error on CanvasPaintThread receive ({})" , e) ;
73- } ,
91+ }
92+ }
7493 }
7594 }
7695 } )
7796 . expect ( "Thread spawning failed" ) ;
7897
79- sender
98+ ( create_sender , ipc_sender )
8099 }
81100
82101 pub fn create_canvas (
0 commit comments