#ncurses #curses #pdcurses #后端 #鼠标输入

pancurses

pancurses 是一个用于 Rust 的 curses 库,它通过抽象所使用的后端(分别对应 ncurses-rs 和 pdcurses-sys)来支持 Unix 和 Windows 平台。

16 个重大版本发布

使用旧的 Rust 2015

0.17.0 2021 年 9 月 29 日
0.16.1 2018 年 12 月 26 日
0.16.0 2018 年 6 月 9 日
0.15.0 2018 年 2 月 25 日
0.3.0 2016 年 3 月 31 日

⚠️ 报告了问题

#160 in 命令行界面

Download history 1118/week @ 2024-03-14 1283/week @ 2024-03-21 1428/week @ 2024-03-28 1240/week @ 2024-04-04 1415/week @ 2024-04-11 1482/week @ 2024-04-18 1317/week @ 2024-04-25 1180/week @ 2024-05-02 1158/week @ 2024-05-09 1152/week @ 2024-05-16 1227/week @ 2024-05-23 1313/week @ 2024-05-30 1154/week @ 2024-06-06 1226/week @ 2024-06-13 1330/week @ 2024-06-20 839/week @ 2024-06-27

4,762 每月下载量
用于 57 个 crate (44 个直接使用)

MIT 许可证

96KB
2K SLoC

pancurses Build Status Build status Crates.io

pancurses 是一个用于 Rust 的 curses 库,它通过抽象所使用的后端(分别对应 ncurses-rspdcurses-sys)来支持 Linux 和 Windows 平台。

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

文档

需求

Linux

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

有关更多详细信息,请查看 ncurses-rs

Windows

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

有关更多详细信息,请查看 pdcurses-sys

使用方法

Cargo.toml

[dependencies]
pancurses = "0.17"

main.rs

extern crate pancurses;

use pancurses::{initscr, endwin};

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

使用 getch() 进行模式匹配

extern crate pancurses;

use pancurses::{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 pancurses;

use pancurses::{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.pancurses]
version = "0.17"
features = ["win32a"]

[dependencies.pancurses]
version = "0.17"
features = ["win32"]

(字体,粘贴) 菜单

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

调整大小

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

许可证

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

依赖项

~0.1–0.9MB
~16K SLoC