#curses #ncurses #terminal-interface #pdcurses #mouse-input

crosscurses

crosscurses 是一个为 Rust 设计的 curses 库,它通过抽象掉后端(分别是 ncurses-rs 和 pdcurses-sys)来支持 Unix 和 Windows 平台。

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2020年1月10日

#492 in 硬件支持


用于 终端

MIT 许可证

97KB
2K SLoC

跨平台 curses 库。

Latest Version docs Lines of Code MIT

免责声明

这是从 pancurses 分支出来的,由 terminal 使用。创建这个分支是因为 terminal 需要一些未合并或发布的函数。Pancurses 似乎已经不再活跃。但是,我仍然希望发布 terminal。这就是我创建这个分支库的原因。我 强烈 建议您不要使用它。而应该使用原始的 pancurses 库。如果 pancurses 决定继续其活动,这个分支很可能将不再维护。

Crosscurses

crosscurses 是一个 curses 库,为 Rust 支持Linux和Windows,通过抽象掉使用的后端(分别为 ncurses-rspdcurses-sys)。

目标是提供一个更 Rust 风格的界面,比常规的 curses 函数更易于使用,同时足够接近 curses 以便于移植。

要求

Linux

ncurses-rs 需要链接到本机的 ncurses 库,因此需要安装以便链接器可以找到它。

有关更多详细信息,请参阅 ncurses-rs

Windows

pdcurses-sys 在构建过程中将本机的 PDCurses 库编译为部分,因此您需要一个兼容的 C 编译器,该编译器与您使用的 Rust 版本的 ABI 匹配(因此是 GCC 用于 GNU ABI 或 cl 用于 MSVC)

有关更多详细信息,请参阅 pdcurses-sys

使用

Cargo.toml

[dependencies]
crosscurses = "0.1"

main.rs

use crosscurses::{initscr, endwin};

fn main() {
  let window = initscr();
  window.printw("Hello Rust");
  window.refresh();
  window.getch();
  endwin();
}

使用 getch() 进行模式匹配

use crosscurses::{initscr, endwin, Input, noecho};

fn main() {
  let window = initscr();
  window.printw("Type things, press delete to quit\n");
  window.refresh();
  window.keypad(true);
  noecho();
  loop {
      match window.getch() {
          Some(Input::Character(c)) => { window.addch(c); },
          Some(Input::KeyDC) => break,
          Some(input) => { window.addstr(&format!("{:?}", input)); },
          None => ()
      }
  }
  endwin();
}

处理鼠标输入

要接收鼠标事件,您需要同时启用键盘模式并设置一个与您感兴趣的事件相对应的鼠标掩码。鼠标事件是以与键盘事件相同的方式接收的,即通过调用 getch()。

extern crate crosscurses;

use crosscurses::{ALL_MOUSE_EVENTS, endwin, getmouse, initscr, mousemask, Input};

fn main() {
    let window = initscr();

    window.keypad(true); // Set keypad mode
    mousemask(ALL_MOUSE_EVENTS, std::ptr::null_mut()); // Listen to all mouse events

    window.printw("Click in the terminal, press q to exit\n");
    window.refresh();

    loop {
        match window.getch() {
            Some(Input::KeyMouse) => {
                if let Ok(mouse_event) = getmouse() {
                    window.mvprintw(1, 0,
                                    &format!("Mouse at {},{}", mouse_event.x, mouse_event.y),
                    );
                };
            }
            Some(Input::Character(x)) if x == 'q' => break,
            _ => (),
        }
    }
    endwin();
}

您还可以通过指定 REPORT_MOUSE_POSITION 标志来接收鼠标移动的事件(只要您的终端支持它)

mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, std::ptr::null_mut());

终端调整大小

当终端被用户调整大小时,会触发一个Input::KeyResize事件。您应该通过调用resize_term(0, 0)来处理,以便让curses调整其内部结构以匹配新的大小。

PDCurses (Windows) 详细信息

pdcurses-sys支持两种PDCurses版本,win32a和win32。win32a是GDI模式,而win32则在Windows控制台中运行。win32a在颜色和文本效果方面有更好的支持。

默认情况下使用win32a版本,但您可以通过使用Cargo标志来指定您想使用的版本。在Cargo.toml中简单指定功能,如下所示

[dependencies.crosscurses]
version = "0.16"
features = ["win32a"]

[dependencies.crosscurses]
version = "0.16"
features = ["win32"]

(字体,粘贴) 菜单

PDCurses win32a有一个菜单,允许您更改字体并将文本粘贴到窗口中。crosscurses默认禁用窗口,但用户仍然可以通过右键单击标题栏来访问它。如果您想保留PDCurses默认的行为,即保留菜单,请设置功能"show_menu"

调整大小

在win32a中,默认允许用户自由调整窗口大小。如果您想禁用调整大小,请设置功能"disable_resize"

许可证

根据MIT许可证授权,请参阅LICENSE.md

依赖项

~0.1–0.9MB
~16K SLoC