(
resolution: Resolution,
default_fg_color: Option<u8>,
default_bg_color: Option<u8>,
font: &'static Font,
request_rx: Receiver<Request>,
response_tx: SyncSender<Response>,
| 755 | /// Runs the main graphics loop. |
| 756 | #[allow(clippy::too_many_arguments)] |
| 757 | pub(crate) fn run( |
| 758 | resolution: Resolution, |
| 759 | default_fg_color: Option<u8>, |
| 760 | default_bg_color: Option<u8>, |
| 761 | font: &'static Font, |
| 762 | request_rx: Receiver<Request>, |
| 763 | response_tx: SyncSender<Response>, |
| 764 | on_key_tx: Sender<Key>, |
| 765 | signals_tx: async_channel::Sender<Signal>, |
| 766 | ) { |
| 767 | let ctx = match Context::new(resolution, font) { |
| 768 | Ok(ctx) => ctx, |
| 769 | Err(e) => { |
| 770 | response_tx.send(Response::Empty(Err(e))).expect("Channel must be alive"); |
| 771 | return; |
| 772 | } |
| 773 | }; |
| 774 | |
| 775 | let info = ctx.get_info(); |
| 776 | let mut ctx = SharedContext(Rc::from(RefCell::from(ctx))); |
| 777 | |
| 778 | let input = NoopInputOps {}; |
| 779 | let mut console = |
| 780 | GraphicsConsole::new(input, ctx.clone(), NoopAudioOps, default_fg_color, default_bg_color) |
| 781 | .expect("Console initialization must succeed"); |
| 782 | |
| 783 | response_tx.send(Response::Empty(Ok(()))).expect("Channel must be alive"); |
| 784 | |
| 785 | let mut budget = LOOP_POLL_BUDGET; |
| 786 | loop { |
| 787 | let mut did_something = false; |
| 788 | |
| 789 | match request_rx.try_recv() { |
| 790 | Ok(request) => { |
| 791 | let response = match request { |
| 792 | Request::Exit => break, |
| 793 | |
| 794 | Request::Clear(how) => Response::Empty(console.clear(how)), |
| 795 | Request::SetColor(fg, bg) => Response::Empty(console.set_color(fg, bg)), |
| 796 | Request::EnterAlt => Response::Empty(console.enter_alt()), |
| 797 | Request::HideCursor => Response::Empty(console.hide_cursor()), |
| 798 | Request::LeaveAlt => Response::Empty(console.leave_alt()), |
| 799 | Request::Locate(pos) => Response::Empty(console.locate(pos)), |
| 800 | Request::MoveWithinLine(off) => Response::Empty(console.move_within_line(off)), |
| 801 | Request::Print(text) => Response::Empty(console.print(&text)), |
| 802 | Request::ShowCursor => Response::Empty(console.show_cursor()), |
| 803 | Request::GlyphSize => Response::GlyphSize(info.glyph_size), |
| 804 | Request::SizeChars => Response::SizeChars(info.size_chars), |
| 805 | Request::SizePixels => Response::SizePixels(info.size_pixels), |
| 806 | Request::Write(text) => Response::Empty(console.write(&text)), |
| 807 | Request::BucketFill(xy) => Response::Empty(console.bucket_fill(xy)), |
| 808 | Request::DrawCircle(center, radius) => { |
| 809 | Response::Empty(console.draw_circle(center, radius)) |
| 810 | } |
| 811 | Request::DrawCircleFilled(center, radius) => { |
| 812 | Response::Empty(console.draw_circle_filled(center, radius)) |
| 813 | } |
| 814 | Request::DrawLine(x1y1, x2y2) => Response::Empty(console.draw_line(x1y1, x2y2)), |
no test coverage detected