/LGC窗口管理/DirectFB窗口管理器(unique)研究笔记

本文探讨DirectFB中的独特窗口管理器(unique),包括其功能、架构设计及扩展机制。详细解析了输入事件处理流程、窗口栈管理以及窗口装饰等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DirectFB窗口管理器(unique)研究笔记

DirectFB 窗口 管理 器(unique)研究笔记

转载时请注明出处和作者联系方式
作者联系方式:李先静 <xianjimli at hotmail dot com>

DirectFB自带有两个窗口管理器:default和unique,可以在配置文件 中用wm=xxx来选择用哪一个作为当前的窗口管理器。

两个窗口管理器的功能 都很简单,与桌面环境 流行的窗口管理器几乎没有可比性。尤其是前者,提供的功能更是简陋,仅仅是管理一下窗口栈而已。后者虽然简陋,但其架构设计还算不错,很容易在上面扩展自己需要的功能。

什么是窗口管理器呢?根据EWMH的要求,窗口管理器的基本功能有以下这些:

模态窗口(Modality)。一般用来实现模态对话框,所谓模态对话框,就是具有这样特性的对话框,除非你把它关掉,否则无法切换回到它的父窗口上。

大桌面(Large Desktop)。显示器的大小是有限的,比如显示器的分辨率 为1024x768,那么传统的桌面就只能这么大一点。窗口管理器可以实现一个逻辑上的大桌面,较显示器的物理分辨率,拥有更大的显示范围。当然你在某个时刻只能看到桌面的一部分,这部分也称为viewport,通过变换viewport可以看到桌面的其它区域。

固定窗口(Sticky window s)。固定窗口要求窗口的位置被固定到显示器的物理位置, viewport的变换对它的位置都没有影响。

虚拟桌面(Virtual Desktops)。同时打开的窗口太多时,可以把这些窗口分成不同的组,同一时刻只显示其中一组的窗口,每一组窗口就是一个虚拟桌面。

任务条(Taskbars)、分页器(Pagers) 。显示当前所有的打开的窗口,并且可以在这些窗口之间切换。

窗口栈序(Z-Order) 。就是窗口之间的上下关系。

保留区域(reserve space)。让某个窗口独占某块靠边的区域,比如任务条,一般都独占桌面最下面的一长条区域。

窗口状态(Window State) 。窗口有最大化、最小化、全屏等的状态,这些由窗口管理器负责管理。当然,上层应用 也可以调用窗口管理器提供的函数 ,来改变窗口的状态。

窗口装饰。在unix下,GUI 的惯例是,窗口的标题和四周的边框,都称为装饰,这些装饰的显示是由窗口管理器负责的。这样的好处时,应用程序 无须做任何修改,仅通过配置窗口管理器,就可以得到风格各异的显示效果

窗口协议。这主要用于实现窗口僵死状态检测,窗口之间的同步处理等功能。

对于嵌入式 系统 来说,并不要求实现桌面环境上的一些花梢的功能。unique的实现虽然简单,也可以满足基本需求,更重要的是它提供了较好的扩展机制。

DirectFB采用模块化设计,它并不依赖于某种具体的窗口管理器,只要具体的窗口管理器实现接口 CoreWMFuncs中定义的函数,就可以挂到DirectFB中运行

Reactor在DirectFB中无处不在,要理解DirectFB的架构一定要理解reactor模式才行。不过,这里的reactor与POSA中 讲解的reactor类似,但并不完全相同,它更类似于signal机制,如果你理解glib中的signal或者boost中的signal机制,理解 reactor并不难。DirectFB中reactor最大的优点在于它是跨进程的,通过fusion 内核 模块中转,在一个进程中触发的事件可以方便的中转到另外一个进程。

Unqiue的源代码在wm/unique目录下,下面我们以输入 事件流把它们贯穿起来分析一下:

在DirectFB中,每一种输入设备 ,都有一个线程挂在上面,只要输入设备有事件上报,该线程就通过reactor把事件转发给相应的reactor处理函数。窗口管理在初始时(unique_wm_module_init),调用dfb _input_add_global把_unique_device_listener设置 为事件处理函数。

在_unique_device_listener中,并没有对事件直接处理,而又把它转给相应的UniqueDeviceClass对象,实现UniqueDeviceClass接口的有keyboard、pointer、wheel三种,每一种都有一个实例。

在这里,UniqueDeviceClass作为一个中间层,是否是多此一举呢?开始我也这样认为,过好长一段时间后,我才明白这样做是有道理的。原因是从不同设备读到的事件格式 并不统一,比如有的绝对坐标,有的是相对坐标,键值映射关系也不一致。这个中间层可以把这些事件转换成统一的格式,上层无需要再关系这些底层细节。

把事件转换之后,然后通过reactor分发出去,就到_unique_input_switch_device_listener函数里。 _unique_input_switch_device_listener里面通过当前的上下文以及事件的内容,决定谁是该事件的目标。

这里有两点比较有趣。

第一是StretRegion。StretRegion就是一块区域,StretRegion与窗口的关系又是什么样的呢?这种关系很很简单,一般的窗口 (带装饰的窗口)有十个StretRegion组成,它们分别是四边、四角、窗口客户区以及这九个StretRegion的父StretRegion(也 称为frame)。

对于键盘 事件,一般是焦点窗口的客户区收到事件,如果是笔点事件,则由笔点的位置决定是哪个StretRegion收到事件。

第二是决定了目标StretRegion之后,并不是直接把事件投递给这个StretRegion,而是调用StretRegion的GetInput函数,获取 一 个input_channel的对象。这似乎也是多此一举,实则不然,窗口的四边、四角、窗口客户区九个区域是完全独立的,它不知道也不应该知道其它八的 存在,另外这个九个区域的地位也不是等同的,有的要自己处理事件,有的不用,只有每个StretRegion自己才知道,所以由GetInput去决定把 事件给谁。

事件经过input_channel之后,就轮到_unique_window_input_channel_listener函数处理了。这时,事件才真正被投递到相应的窗口,之后事情与窗口管理器就无关了。

对Z-Order的管理,实际上比较简单,无非就是调整窗口在栈的位置,所谓栈其实并不是真正的栈,只是一个双向链表,大家都习惯的称为栈罢了。

Unique实现了简单的装饰功能,相关代码在foo_update里(并没有用到decoration.c/.h)。它的图片数据 在data目录中。Unique的装饰功能最大的缺陷是,没有根据不同类型的窗口实现不同的装饰。

<think>好的,我现在需要帮助用户解决如何在VMware中安装合适的USB设备驱动的问题。首先,我需要理解用户的问题到底是什么。用户提到的是“VMware USB device在哪下载合适的驱动”,可能是指当他们在VMware虚拟机中使用USB设备时遇到了驱动问题,需要找到正确的驱动程序。 接下来,我要回忆一下VMware产品中关于USB设备支持的相关知识。VMware Workstation和Fusion等产品通常会自动处理USB设备的连接,但在某些情况下,可能需要安装额外的驱动,尤其是在客户机操作系统中。例如,如果客户机是Windows,可能需要安装VMware Tools来增强USB支持;如果是Linux,可能需要特定的驱动包。 然后,我需要考虑用户可能的具体情况。用户可能已经将USB设备连接到主机,但在虚拟机中无法识别,或者出现驱动错误。这时候需要确定是主机驱动的问题还是客户机驱动的问题。通常,主机不需要额外驱动,因为VMware会通过自身的服务处理USB设备的连接,而客户机可能需要安装VMware Tools来获得更好的兼容性。 接着,我需要思考正确的步骤来引导用户解决问题。首先,应该检查VMware Tools是否已经安装,这是解决很多设备兼容性问题的第一步。如果已经安装,可能需要更新到最新版本。其次,对于客户机操作系统,比如Windows,可能需要检查设备管理器中的USB控制器是否有感叹号,是否需要手动安装驱动。此外,还需要确认主机的USB控制器设置是否正确,比如在虚拟机设置中选择USB兼容性版本(如USB 3.0或2.0)。 如果用户的问题是关于主机系统的驱动,比如VMwareUSB控制器驱动在主机上出现问题,可能需要到VMware官网下载并重新安装VMware Workstation或Player,这样会自动安装所需的驱动。另外,某些情况下,主机的USB驱动可能需要更新,比如芯片组驱动或USB 3.0驱动,这需要到主机厂商的网站下载。 还需要考虑用户可能的误解。例如,用户可能认为需要单独下载USB驱动,但实际上,大多数情况下,VMware Tools已经包含了必要的驱动。如果用户已经安装了VMware Tools但仍然有问题,可能需要进一步的故障排除,比如检查USB设备的兼容性,尝试不同的USB端口,或者重启VMware的相关服务。 最后,整理出清晰的步骤,确保用户能够按照流程操作,同时提醒常见的注意事项,比如以管理员身份运行安装程序,确保虚拟机配置正确等。可能还需要提供VMware官网的链接,方便用户下载工具或更新版本。</think>在VMware虚拟机中使用USB设备时,通常不需要单独下载"VMware USB设备驱动",但需要按以下流程操作: ### 一、基础准备 1. **主机端** - 确保主机已安装最新版VMware Tools(VMware Workstation/Fusion自带) - 无需单独下载驱动,系统会自动加载`vmware-usbarbitrator`服务 2. **虚拟机配置** - 打开虚拟机设置 → USB控制器 → 勾选`USB兼容性`(建议选3.0或自动) ### 二、客户机驱动安装 1. **Windows客户机** - 安装VMware Tools(虚拟机菜单 → 管理 → 安装VMware Tools) - 插入USB设备后,会自动加载`vmware USBCCID`驱动程序 2. **Linux客户机** - 安装open-vm-tools: ```bash sudo apt-get install open-vm-tools-desktop ``` - 加载USB驱动模块: ```bash sudo modprobe uhci_hcd ehci_hcd ohci_hcd xhci_hcd ``` ### 三、常见问题排查 1. **设备无法识别** - 检查主机设备管理器 → 确保无`VMware USB Device`黄色感叹号 - 重启服务:`services.msc` → 重启`VMware USB Arbitration Service` 2. **特殊设备支持** - 加密狗/工控设备需在虚拟机设置 → USB控制器 → 开启`显示所有USB输入设备` - 对于USB转串口设备,建议在客户机安装对应芯片驱动(如FTDI、CH340) ### 四、驱动下载渠道(仅限特殊情况) 如需获取底层驱动文件,可通过: 1. VMware官网支持页面: ``` https://customerconnect.vmware.com/downloads ``` 2. 选择对应产品 → 驱动包通常包含在`VMware Tools Bundle`中 > **注意事项**: > - 虚拟机运行时才能看到USB设备连接选项 > - 苹果M系列芯片需使用ARM版Windows/Linux系统 > - 安卓设备需开启开发者模式+USB调试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值