恢复旧的X代码

2021-01-04 05:03:28

我今年休假了圣诞节和新年之间的一周。 Ididn确实没有任何认真的计划,只是与通常的惯例有所不同。通常,当我收到这个简单的错误报告Debian Bug#974011时,我就开始做一个项目。

我最近一直在研究旧的终端机和X游戏,并意识到来自&xmille'的许多代码源于终端游戏“ mille”,它是bsdgames ...的一部分。[版权和许可信息]已从xmille发行版的所有代码中剔除。此外,所包含的材料均不归功于原始作者Ken Arnold。

xmille'的原因来源缺少来自&mille'的版权和许可信息文件是在将这些信息添加到上游之前复制的。 Xmille在1987年左右的Mille分叉。我为当时运行X10R4的系统编写了UI部分。在某个时候已经完成了X11的非常基本的移植,这就是Debian在今天的档案中所拥有的。

在90年代的某个时候,我将Xmille移植到Athena小部件集,包括Xaw扩展库Xkw中的几个自定义小部件。它比Debian中的版本好很多,包括正确显示卡片(Debian版本存在一些非常糟糕的颜色问题)。

为了解决缺少的版权和许可信息,我将它们的源代码导入了" latest"中。基于Xaw的版本。更新的密尔代码具有许多错误修复和改进,以及版权信息。

那应该足以解决问题,我本可以从所需的任何位构建一个合适的源包,然后将其上传并替换为“ xmille”。包。

但是,在后来的某个时候,我实际上将xmille合并到一个较大的程序包中,即“ kgames”,其中还包括许多其他游戏,包括Reversi,Domino,Cribbage和10个Solitaire / Patiencevariants。 (顺便说一句,最近的十款游戏构成了myPatience Palm Pilot应用程序的基础,该应用程序似乎启发了同名的Android应用程序...)

好的,所以运行这个旧的源代码应该很容易,对吗?它只是一堆在80年代和90年代设计的C代码,可以在VAXen及其同类上工作。它能有多难?

那时的一切都是32位计算机。指针和整数均为32位,因此您可以毫不费力地放弃它们,并且不会造成任何问题。今天,测试发现代码的某些角落存在段错误。

它是K& R C代码。请记住,ANSI-C的第一个版本直到1989年才问世,几年后,我们可以可靠地期望找到带有随机Unix盒的ANSI编译器。

它是X11代码。幸运的是,自编写这些应用程序以来,X11尚未更改,因此至少该部分仍然可以正常工作。想象一下,尝试从90年代初期开始在现代OS上构建Windows或Mac OS代码...

我决定在各处挖掘并添加原型。发现了很多指针/ int强制转换问题,以及几个潜伏的错误,这些错误只是简单地破坏了代码。

大约一天后,我开始构建和运行东西,不再遇到崩溃。

完成之后,我决定至少可以将工作位上传到Debian档案库并关闭上面报告的错误。 kgames 1.0-2可能最终会变得不稳定,大概是在DebianFTP小组意识到修复此错误的重要性之后。或者其他的东西。

是的,Xaw应用程序具有质朴的外观,可能对某些人有吸引力,但对于具有高分辨率显示器和“季节适当”视力的人来说,斜视微小的图像和文字使今天很难享受这些游戏。

我决定深入研究并开始破解代码,首先是向使用cairo进行绘图而不是coreX调用的Xkw库中添加newwidget。幸运的是,游戏的需求非常有限,因此我只需要实现一些小部件即可:

KLabel。显示文本字符串。它允许字符串左对齐,居中对齐或右对齐。就是这样。

K切换。一个推/推按钮,大多数实现使用KCommand。还支持“无线电组”推动oneon使组中的其他人关闭。

KMenuButton。用于调出菜单小部件的按钮;这是在KCommand之上构建的一些非常简单的行为。

KSimpleMenu,KSmeBSB,KSmeLine。这三个创建弹出菜单; KSimpleMenu创建一个可以容纳任意数量的KSmeBSB(字符串)和KSmeLine(分隔线)对象的容器。

其他Xkw小部件的渲染都改为使用cairo,再加上使用双缓冲使更新看起来更好。

在Wikimedia上查看时,我发现了一个页面,该页面引用了大量SVG形式的扑克牌,这使我进入了Adrian Kennard的扑克牌网站,该网站使我可以自定义和下载一副纸牌,并使用CC0 Public Domain许可证进行许可。

使用这些卡,我着手重写Xkw纸牌小部件,剥离出三种不同版本的位图纸牌,并仅用这些新的SVG版本替换它们。

好的,因此获得常规的扑克牌是很好的,但是最初的目标是更新Xmille,而这是我手工绘制的牌。我可以只使用这些图像,将它们导入开罗,然后将其缩放以适合屏幕显示。我决定尝试使用inkscape的位图跟踪代码来查看它可以对它们进行什么处理。

首先,我必须将它们设置为inkscape可以解析的格式。事实证明这有点棘手。原始格式是一组Xbitmap图层;每层都绘制一种颜色。我最终破解了Xmille源代码以使用X生成图像,然后使用XGetImage提取它们并遍历它们以构建XPM格式文件,然后可以将其输入到便携式位图工具中以创建inkscape可以处理的PNG文件。

我确实替换了图像中的文本以使其可读,否则这些内容就不会影响到生成的inkscape。

请记住,所有这些都是使用venerableX工具包构建的应用程序。由于形状按钮使用X形状扩展名,因此仍然可以看到一些非抗锯齿的图形。但是,现在所有渲染都是使用cairo完成的,因此所有渲染都是抗锯齿的,并且都是可扩展的。