EGL--鼠标类函数实现文件 MOUSE.INC

鼠标功能的Pascal代码实现
该博客提供了一系列用Pascal语言编写的鼠标功能代码,包括设置事件处理程序、事件处理器、重置鼠标、控制鼠标开关、设置鼠标形状和位置等,还涉及双击和单击判断等功能,为鼠标操作相关开发提供了代码示例。

/*
  MOUSE.INC
*/

void pascal set_event_handler(int call_mask,void far( *location)())
{
  union REGS r;
  struct SREGS sr;
  if(MOUSE_THERE){   /* THE MOUSE FUNCTION 12 */
     r.x.ax=12;
     r.x.cx=call_mask;
     r.x.dx=FP_OFF( location );
     sr.es=FP_SEG( location );
     int86x(0x33,&r,&r,&sr);
     }
}
/*---------------------------------------------------------------------*/
void near event_processor(int event_status,int button_status,int x,int y)
     /* LOAD THE MOUSE EVENT PROGRAGM */
{
  if(MOUSE_THERE){
     if( (CMX!=x) || (CMY!=y) ){
      MOUSE_MOVED=1;
      CMX=x; CMY=y;
      }
     else
      MOUSE_MOVED=0;
     BSTATE=button_status;
     if(event_status & 2){  LBUTTON_DOWN=1; LBUTTON_UP=0;  }
     if(event_status & 8){  RBUTTON_DOWN=1; RBUTTON_UP=0;  }
     if(event_status & 4){  LBUTTON_UP=1;   LBUTTON_DOWN=0; }
     if(event_status & 16){ RBUTTON_UP=1;   RBUTTON_DOWN=0; }
  }
}
/*--------------------------------------------------------------------*/
int reset_mouse(void)   /* THE MOUSE FUNCTION 0 */
{
   _AX=0;
   geninterrupt(0x33);
   if(_AX>0){
      MOUSENUM=_AX;
      MOUSE_THERE=1;
      mouse_on();
      return(OK);
      }
   else{
      MOUSE_THERE=0;
      return(ERROR);
      }
}
/*-------------------------------------------------------------------*/
void mouse_off(void)   /* THE MOUSE FUNCTION 2 */
{
   if( !MOUSE_THERE || MOUSE_VISIBLE==0 ) return;
   _AX=2;
   geninterrupt(0x33);
   MOUSE_VISIBLE=0;
}
/*-------------------------------------------------------------------*/
void mouse_on(void)   /* THE MOUSE FUNCTION 1 */
{
   if( !MOUSE_THERE || MOUSE_VISIBLE==1 ) return;
   _AX=1;
   geninterrupt(0x33);
   MOUSE_VISIBLE=1;
}
/*-------------------------------------------------------------------*/
void mouse_shape(int shape[32],int hotx,int hoty)
{
   union REGS regs;
   struct SREGS sregs;
   mouse_off();
   regs.x.ax=9;
   regs.x.bx=hotx;
   regs.x.cx=hoty;
   regs.x.dx=FP_OFF(shape);
   sregs.es=FP_SEG(shape);
   int86x(0x33,&regs,&regs,&sregs);
   mouse_on();
}
/*------------------------------------------------------------------*/
void set_mouse_position(int x,int y)
{
   _AX=4;
   _CX=x;
   _DX=y;
   geninterrupt(0x33);
}
/*-------------------------------------------------------------------*/
/*
调用双击的条件为判断是否为左键下
当调用双击不成时,再检查一次左键按下否,如下,{则说明刚才为单击,将左键状态消去}
即:每次调用双击后,必须再调用一次单击,否则有可能丢失键击状态
if( LBUTTON_DOWN ){
  if( get_double_press() ) ... 双击如何
  else ...单击如何
  }
*/
int get_double_press(void); /* get if lbutton was pressed twice */
int get_double_press(void)
{
   int x,y;
   if( LBUTTON_DOWN ){
       LBUTTON_DOWN=0;
       x=CMX; y=CMY;
       Delay(DOUBLE_CLICK_TIME);
       if(LBUTTON_DOWN && x==CMX && y==CMY){
  LBUTTON_DOWN=0;
  LBUTTON_UP=0;
  return(1);
  }
       else{
  LBUTTON_DOWN=1;
  return(0);
  }
   }
}
/*--------------------------------------------------------------------*/
void set_text_cursor(int groundmask,int textmask)
{
   _AX=10;
   _BX=0;
   _CX=groundmask;
   _DX=textmask;
   geninterrupt(0x33);
}
/*--------------------------------------------------------------------*/
void InstallEvent(void)
{
   set_event_handler(127,event_handler);
}
/*-----------------------------------------------------------*/
void reset_event_status(void)
{
   MOUSE_MOVED=0; LBUTTON_DOWN=0;
   RBUTTON_DOWN=0; LBUTTON_UP=0;
   RBUTTON_UP=0; BSTATE=0;
}
/*------------------------------------------------------------------------*/
void set_mousex(int minx,int maxx)
{
   _AX=7;
   _CX=minx;  _DX=maxx;
   geninterrupt(0x33);
}
/*-----------------------------------------------------------------------*/
void set_mousey(int miny,int maxy)
{
   _AX=8;
   _CX=miny;  _DX=maxy;
   geninterrupt(0x33);
}

<think> 我们注意到用户的问题是关于解决“libnvidia-egl-wayland1没有可安装候选”的问题。根据提供的引用,我们知道NVIDIA egl-wayland是一个开源项目,它提供了EGL在Wayland上的支持。用户可能在安装这个包时遇到了问题。 首先,我们需要明确,libnvidia-egl-wayland1是NVIDIA提供的用于支持Wayland的EGL库。在Ubuntu系统中,这个包通常由NVIDIA官方驱动提供。 可能的原因和解决方案: 1. 系统没有添加正确的NVIDIA驱动仓库。默认的Ubuntu仓库可能不包含这个包,或者包含的版本不匹配。 2. 系统当前安装的NVIDIA驱动版本不包含这个包,或者该包在当前的驱动版本中被命名成其他名字。 3. 系统架构不支持(比如尝试在32位系统上安装64位的包)或系统版本太旧。 步骤: 1. 确保系统已经安装了官方的NVIDIA驱动。可以使用以下命令查看安装的驱动: ```bash nvidia-smi ``` 2. 确保已经启用了正确的仓库。通常,NVIDIA的Linux驱动仓库需要手动添加。但Ubuntu一般会将专有驱动放在“附加驱动”中,所以也可以通过“软件和更新”中的“附加驱动”选项卡来安装。 3. 如果已经安装了NVIDIA驱动,但仍然找不到这个包,可能是因为该包在当前的驱动版本中已经被废弃或改名。我们可以尝试搜索相关的包: ```bash apt search nvidia-egl-wayland ``` 4. 如果搜索不到,我们可以考虑从NVIDIA官方网站下载驱动,并检查其中是否包含这个包。或者,我们可以尝试安装完整的NVIDIA驱动包,因为libnvidia-egl-wayland1可能是某个大包的一部分。 5. 另外,根据引用[2],有时重新安装构建工具和依赖库可以解决问题。但这里的问题更可能是缺少NVIDIA的专有驱动仓库。 具体操作建议: 步骤1:添加NVIDIA专有驱动仓库 首先,确保系统已经添加了NVIDIA的PPA(如果可用)或者已经配置了官方驱动仓库。对于Ubuntu,可以尝试添加Graphics Drivers PPA: ```bash sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update ``` 步骤2:安装NVIDIA驱动 然后,安装适合你显卡的最新版NVIDIA驱动(或者指定版本): ```bash sudo apt install nvidia-driver-XXX # 将XXX替换为版本号,如470、510等 ``` 安装驱动后,重启系统。 步骤3:安装libnvidia-egl-wayland1 再次尝试安装: ```bash sudo apt install libnvidia-egl-wayland1 ``` 如果仍然找不到包,可以尝试使用通配符搜索: ```bash apt search egl-wayland ``` 步骤4:如果还是找不到,考虑从源码构建 根据引用[1],我们可以从NVIDIA egl-wayland项目的GitHub仓库(https://github.com/NVIDIA/egl-wayland)获取源码并编译安装。 编译安装步骤大致如下: ```bash sudo apt install git meson ninja-build pkg-config wayland-protocols libwayland-dev libegl-dev git clone https://github.com/NVIDIA/egl-wayland.git cd egl-wayland meson build ninja -C build sudo ninja -C build install ``` 注意:这种方式安装的库可能不会被包管理器管理,需要自行维护。 步骤5:检查系统兼容性 确保你的系统是64位且支持Wayland。同时,确保你的NVIDIA驱动支持egl-wayland。通常,较新的驱动版本支持。 如果以上步骤都无法解决,可能需要考虑系统版本是否太旧,或者等待NVIDIA更新驱动。 注意:在安装过程中,确保网络连接正常,以便下载包和源码。 相关问题: 1. 如何检查当前安装的NVIDIA驱动版本? 2. 如何添加和移除PPA仓库? 3. 如何从源码编译安装软件? </think> ### 解决 libnvidia-egl-wayland1 没有可安装候选的问题 #### 问题原因分析 1. **驱动版本不匹配** `libnvidia-egl-wayland1` 是 NVIDIA 专有驱动组件,仅存在于特定版本的驱动包中。若: - 系统安装的 NVIDIA 驱动版本过低 - 使用开源驱动 `nouveau` - 驱动安装不完整 均会导致该问题[^1]。 2. **仓库配置问题** NVIDIA 官方驱动仓库未启用或未包含该包(常见于 Ubuntu 默认仓库)。 3. **系统架构限制** 32 位系统无法安装 64 位专属驱动组件。 #### 解决方案 ##### ✅ 方法 1:安装官方 NVIDIA 驱动(推荐) ```bash # 添加官方显卡驱动 PPA sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update # 安装最新 NVIDIA 驱动(自动包含所需组件) sudo ubuntu-drivers autoinstall # 重启系统 sudo reboot ``` ##### ✅ 方法 2:手动安装完整驱动包 ```bash # 查询可用驱动版本 ubuntu-drivers devices # 安装指定版本驱动(示例为 525 版本) sudo apt install nvidia-driver-525 libnvidia-egl-wayland1 ``` ##### ✅ 方法 3:添加 NVIDIA 官方仓库 ```bash # 添加 NVIDIA CUDA 仓库 distribution=$(. /etc/os-release;echo $ID$VERSION_ID | sed -e 's/\.//g') sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/7fa2af80.pub echo "deb https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64 /" | sudo tee /etc/apt/sources.list.d/cuda.list # 安装组件 sudo apt update sudo apt install libnvidia-egl-wayland1 ``` ##### ✅ 方法 4:源码编译(备用方案) ```bash # 安装编译依赖 sudo apt install git meson ninja-build pkg-config libwayland-dev # 克隆并编译 egl-wayland 项目 git clone https://github.com/NVIDIA/egl-wayland cd egl-wayland meson build ninja -C build sudo ninja -C build install ``` #### 验证安装 ```bash # 检查组件状态 ldconfig -p | grep libnvidia-egl-wayland # 查看 Wayland EGL 支持 eglinfo -B | grep -i wayland ``` #### 注意事项 1. 安装前务必卸载 `nouveau` 驱动: ```bash sudo apt purge xserver-xorg-video-nouveau ``` 2.使用混合显卡(如 NVIDIA Optimus),需额外配置: ```bash sudo apt install nvidia-prime ``` 3. 较旧 GPU(如 Fermi 架构)需使用 `nvidia-legacy-390xx-driver` 等特殊驱动包[^2]。 --- ### 相关问题 1. 如何检查当前系统使用的显卡驱动型? 2. 安装 NVIDIA 驱动后出现黑屏如何解决? 3. Wayland 和 Xorg 在图形渲染上的主要区别是什么? 4. 如何为专业图形工作站优化 NVIDIA 驱动配置? [^1]: NVIDIA egl-wayland 项目文档 [^2]: Ubuntu 官方驱动支持矩阵
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值