编写设备驱动程序

VIS_CONSCURSOR

VIS_CONSCURSOR ioctl 命令可显示或隐藏光标。以下代码中显示了 vis_conscursor 结构。

struct vis_conscursor {
      screen_pos_t    row;      /* Row to display cursor (in pixels) */
      screen_pos_t    col;      /* Col to display cursor (in pixels) */
      screen_size_t   width;    /* Width of cursor (in pixels) */
      screen_size_t   height;   /* Height of cursor (in pixels) */
      color_t         fg_color; /* Foreground color */
      color_t         bg_color; /* Background color */
      short           action;   /* Show or Hide cursor */
};

要在控制台帧缓存器驱动程序中实现 VIS_CONSCOPY ioctl 命令,请按照下面的通用步骤操作:

  1. 从内核终端仿真器复制 vis_conscursor 结构。

  2. 验证显示参数。如果任一显示参数超出范围,则会返回错误。

  3. 使所有用户上下文无效,以使用户应用程序不能通过用户内存映射同时访问帧缓存器硬件。在轮询式 I/O 模式下,既不允许也没有必要执行此步骤,因为用户应用程序并没有运行。请务必持有锁,以便在完成 VIS_CONSDISPLAY ioctl 之前,用户无法通过缺页恢复映射。

  4. 终端仿真器可通过以下两个操作之一调用 VIS_CONSCOPY ioctlSHOW_CURSORHIDE_CURSOR。以下步骤介绍如何通过读取和写入视频内存实现此功能。您可能也可使用呈现引擎来完成此工作。是否能够使用呈现引擎取决于帧缓存器硬件。

    执行以下步骤可实现 SHOW_CURSOR 功能:

    1. 将像素保存到要在其中绘制光标的矩形内。隐藏光标时将需要使用这些保存的像素。

    2. 扫描要在其中绘制光标的矩形界定的屏幕上的所有像素。在此矩形中,将与指定光标前景色 (fg_color) 匹配的像素替换为白色像素。将与指定光标背景色 (bg_color) 匹配的像素替换为黑色像素。视觉效果为黑色光标悬停在白色文本上。此方法适用于文本的任何前景色和背景色。尝试根据色彩表位置进行反色是不切实际的。也没有必要使用更复杂的策略,例如使用 HSB(Hue, Saturation, Brightness,色调、饱和度和亮度)色彩模式进行反色。

    要实现 HIDE_CURSOR 功能,请将光标矩形下方的像素替换为通过前面的 SHOW_CURSOR 操作保存的像素。