欢迎!这里是Haiku China网站,中文Haiku用户社区。Haiku是一个新型的开源操作系统,主要面向于个人计算机。它继承了BeOS的理念,是一个快速,简洁优雅,易学易用,而且非常强大的操作系统。
最新新闻提要News feed

Haiku OS的黎明

本条新闻由dgy18787 (未验证)发表于2012年5月2日

2001年夏天,程序员Michael Phipps心绪不宁,因为他最爱的桌面系统BeOS即将走向死亡。对一个软件寄予如此深情可能会令人吃惊,但对Phipps等人来说BeOS当之无愧。在当时它运行最流畅,界面直观,并提供了丰富而有趣的编程环境。简而言之,它比当时的其它操作系统更先进。但开发商退出了市场,并将包括BeOS在内的资产出售给竞争对手。Phipps决定创造BeOS的BeOS的开源实现

第二十课

拖拽支持

拖拽是最简单的和系统中其他程序进行交互的方式。多数时候,开发者会在真空中创建他们重达133吨的项目,而忽视了一个事实,用户并不是在真空中使用这一新项目,而是与其他的程序结合使用。例如,在文本处理程序中编写文档可能还需要不时的使用图像编辑器来为用户的文档中添加图片。通过添加拖拽支持,您可以让用户更加快速的进行工作。根据您所实现的程序的不同,添加放置的支持很简单,但是拖动可就有点困难了。

根据 Be Book,在Haiku中,有两种方式来支持拖拽:简单的和协商的方式。但它们都依赖于消息机制来完成这一任务。对于简单的方式,其将一些数据打包入按键释放时发送到目标的消息。接受消息的程序识别出数据,并执行合适的动作。而协商的拖拽方式,就像在某个偏僻的小巷,召唤出带有魔咒的羊皮纸,向虚伪的商人询问时间,其原理如下:

  1. 发送方在拖动消息中放入格式相关的数据字段,我们稍后在对它们详细介绍。
  2. 接收方从格式字段中读取数据,并回复一个所需数据格式的请求和希望对数据进行的处理。
  3. 发送方接收请求,根据请求对数据进行所需的处理,然后以请求的格式发送数据。
  4. 接收方从第二条消息中读取数据,然后任意加以处置。

简单拖拽

第二十二课

深入开发:QuickEdit

假若所有的计算机程序都如HelloWorld或其他演示程序那般简单!开发人员的生活就不会那般艰难。奈何,事实并不如此。在接下来的几节课中,我们将会揭去这层薄的面纱,深入其中了。为任何的操作系统设计简单的程序都会如这些程序一般琐碎,并且它们都会非常的粗糙。幸运的是,随着我们对操作系统功能的学习和了解,您将会对编写稍大型的Haiku程序中所涉及到的内容有所认识。

您可能会问,我们的项目会是什么呢?它是一个简单的格式化文本编辑器,QuickEdit。

尽管Haiku已经有了一个编辑器StyledEdit,所以,毫无疑问,我们编写的代码将会与它有所雷同,但我们添加的功能并不一定都能够在StyledEdit中找到。

第二十一课

Haiku Replicants

“神光普照,雷声轰鸣,天使腾空待发;天际处,黑云密布,鬼影瞳瞳。”

在Haiku的世界里,Replicant除了带了惊奇之外,别无其他,而且它们与刀锋战士无关。相反,它们与组件技术非常相似。对于不熟悉的人来说,组件属于面向对象编程的范畴,程序由对象构成,而它们虽具不同功能,但却具有通用的接口。而Replicant则内建于Haiku API,是一种与基于BView对象交互的方法,但不需要对其有任何了解。远在1995年,BeOS能够在桌面上嵌入一个网络浏览器,而不会像Windows 95一样带来严重的安全风险。但不幸的是,在Be引入这一功能之后,并没有对其进行广泛的使用,但是在近几年,Haiku的开发者则对其进行了推广使用。在本节里,我们将花一些时间来了解它们的原理。

第十九课

在上节课中,我们介绍了Haiku的脚本API,一如如何通过hey终端命令进行操作。那么这节课我们将继续深入,了解使用C++构建脚本的机制。

详解 Haiku 消息

首先,通过脚本API使用C++来操作其他程序的想法乍看之下,毫无头绪,但是我们有理由这么做。其中之一就是它所带来的巨大便利。hey具有自身的限制,其中最重要的原因是它不具有执行命令的能力,并且需要摒弃一些数据以迎合bash命令解析。使用C++来构建脚本需要对Haiku API 的消息类的了解更为深入,而非流于表面,但是它也通过脚本接口带来了强大的功能。

多数 GUI 开发并不会过多的涉及到消息处理类,因为 API 都已经非常完备。多数情况下,我们对应于消息,仅仅明确的发送一次。那么让我们快速的浏览一下那些用于脚本的消息处理类。

BHandler 和 BLooper 完成了消息处理的大部分工作。BHandler 对消息作出响应。BLooper接收消息,并将其传递给附属的BHandler列表,直到它们其中之一对消息作出某些动作,因为BLooper是BHandler的子类,BLooper也可以对消息作出响应。多数情况下,当发送消息到BWindow及其基于BView的控件时,才会发生,BWindow是BLooper的子类,而BView是BHandler的直接子类。

BMessenger 是用以传递这些四处发送的脚本消息的方法。它的对象可能是BLooper或者BHandler,并且提供了一种发送消息到这些对象的方式,而不管对象时在您的程序或者是系统中的其他地方。

C++脚本

使用C++来构建脚本与使用hey并无很大区别。虽然需要很多的输入,但其内容基本完全一样:每个hey命令都是一个单独的消息,而命令仅仅是BMessage的what属性,而其他的则是供BMessage对应方法所处理的说明符。

在动态构建环境中使用Jam

本示例演示了Jam应用于有动态生成需要的自动构建环境中,作为一个必不可少的组件的强大威力。

用户一般的构建过程如下,首先用一个手动预处理配置,然后往往只能够运行一天,因为他们默认的依赖关系是“构建是为了防止我们在配置过程中造成了遗漏”。并且,忧郁生成环境的差异,开发和发布时的构建过程是不同的,这种不同也造成了维护时的构建过程的差异。项目最初的目标是实现整个构建过程的自动化。第二个目标是对于所有的用户确保构建过程都相同。同时使用Jam和一些“胶水”脚本可以实现这两个目标,并且是在相对较短的时间内。

主要的脚本用于扫描当前工作目录及其所有子目录,扫描自定义控制和Jam文件。自定义控制和Jam文件可以通过命名惯例加以区别。自定义控制自动归结为Jam文件。Jam文件直接进行引用。所有的Jam文件都在一个通用的包含文件所引用,这也就形成了基于Jam构建管理的输入控制。

基于Jam的构建管理常用格式如下:

# 输入参数次序:
#   $1 - 生成目标文件
#   $2 - 生成文件的主要源代码
#   $3 - 源代码的配置控制文件
#   $4 - 生成程序 (带有参数)

rule Generate {
GENERATOR on $(1) = $(4) ;
CONTROLS on $(1) = “-c ”$(3) ;

第十八课

Haiku 系统最复杂和最少介绍的部分之一是它用于脚本应用的系统。这多半是因为相对于C++的API来说,这部分对于外行来说,看起来比较复杂,当然事实也是如此。不幸的是,这就是它所带来的便利的代价。Be Book 中关于这一话题的官方文档也并没有让其得以简化。在本节结束,您将会对Haiku中应用的脚本有一个全面的认识。

应用脚本对API的C++细节做了抽象并将其剥离,提供了与应用仅通过消息进行交互以操作对象和属性的方法。在技术上来讲,可以将所有的消息发送到应用并将其脚本化,下面是官方提供的脚本消息常量,它们可用于描述大多数的接口。

命令 描述
B_COUNT_PROPERTIES 获取具有同一属性实例的数量
B_CREATE_PROPERTY 新建某属性的一个实例。注意,它不会为它们添加新属性,而仅用于创建已有属性的实例。
B_DELETE_PROPERTY 删除某属性的一个实例
B_EXECUTE_PROPERTY 运行某属性,类似于执行方法。
B_GET_PROPERTY 获取某属性的值
B_SET_PROPERTY 设置某属性的值

组合脚本

如果没有这一话题的另一部分:获取特定对象的属性列表,如对象支持的脚本接口列表,这些命令并没有很大用处。BHandler类是Haiku脚本支持的基础。每个可脚本化对象都继承自BHandler类,因此它们中的每个类都具有Suites,Messenger和InternalName属性。这一接口的名称为“vnd.Be-handler”,也称之为套件,它并不是MIME类型,尽管有些神似。

Suites属性对我们具有特殊的意义。如果我们从对象中获取(GET)它,它将会返回一个包含了其所支持的属性和套件的列表的消息。我们可以使用终端命令hey来测试,该命令随Haiku绑定发行。在终端中运行下述命令:

第十七课

界面套件(Interface Kit)全部用于创建和使用图形界面中的控件。在一些早期的课程中,我们接触到了套件中存在的一些控件,但是为了充分理解和使用它们,我们需要创建自定义的控件。为此,我们需要了解界面套件的不同部分,以便更有效地加以利用。

Haiku 控件方式

如果您从事编程已经有了一段时间,您可能知道了一些好的代码设计模式。如果还没有,您可以从 Haiku 的 API 中获得此道。Be Inc. 的开发人员非常谨慎的设计了一套 API 并且使之非常易于使用。其中也使用了一些范式,在一些特定的场合可以加以巧妙的使用。

第十六课

字体是一些人需要重复温习的内容之一(那些毫无理由的收集了很多喜欢的东西人),其他人可能很少关心过这些东西。不管您站在那边,了解一下如何在 Haiku 中管理文本的显示也是非常有用的。

在 Haiku 中使用字体

与 Haiku 中其他的附加组件一样,用户可以在系统中用于保存字体的文件夹中添加自己喜欢的字体。您可以使用 find_directory()来获取,即 B_COMMON_FONTS_DIRECTORY,在 Haiku 中,其对应于 /boot/common/data/fonts,而对于 BeOS R5 和 Zeta,则为 /boot/home/config/fonts 。在 R5 和 Zeta 中,字体需要分别放入相应的子文件夹,ttfonts 用于 TrueType 字体,而 psfonts 则用于 PostScript。Haiku 移除了这一限制。当然 Haiku 中,在新安装完字体之后,您也不需要重启系统,可以直接使用。

相对于 BeOS R5 时代,字体的处理已经有了很大的改变。对于一些 BeOS 用户来说,文本渲染总是一块心病。R5 并没有提供文本抗锯齿处理。这种情况在 Zeta 中作了相应的提高,因为它使用了一种不同的字体引擎,由著名的字体公司 Bitstream 所开发。然而,这些提升仅能够用于 Zeta。对于 Haiku,则使用了开源的 FreeType 库提供优秀的字体渲染,并且提供了比之前更多类型的可用字体。

第十五课

我们自己的文件类型

尽管已经存在了许多可用的不同文件类型,其涵盖了从图片到视频文件,以至邮件等所有内容,但是有时候,我们的程序还是需要使用自己独立的文件类型。尽管能够使用一些非标准的扩展来创建文件,实际上在Haiku中创建一个有用并且成熟的文件类型还涉及到其他一些工作。它并不困难,但是确实需要将存储套件(Storage Kit)中的一些东西组织起来,以便使之很好的运行。

同步内容 同步内容