为什么全局菜单难以维护?

为什么全局菜单难以维护?

这个问题完全是出于好奇。

自从 Unity 被“停产”以来,就很少有全局菜单了。我知道 KDE 有一个并不总是有效的全局菜单,Ubuntu Unity 表示他们遇到了一些 Thunderbird 问题,因此停止了支持,因为它太难了(据说)。

这究竟是为什么呢?我从来没有找到过关于这个主题的任何实际文章。

我曾在某处在线读到过一些东西(在某个时间:p),gnome 程序员认为代码很丑陋。

是不是因为大家对于如何做这件事没有达成一致意见,所以没有这样做?还是大家普遍对全球菜单不感兴趣。

真的只是好奇:)

答案1

Linux 中的全局菜单是从特定应用程序内部逻辑导出(与其他应用程序共享菜单结构)的菜单,然后由外部应用程序使用(理解和显示),例如 Linux 桌面。因此,这里要理解的一点是,导出菜单是特定应用程序(该应用程序的特定开发人员)的任务,如果此任务没有以良好的方式完成,那么就无法将菜单作为桌面上的全局菜单在外部显示。

请理解,应用程序开发人员和桌面开发人员是不同的人,可能根本没有联系。如果您认为维护全局菜单是桌面开发人员的任务,我必须说事实并非如此。桌面开发人员的任务只是显示应用程序开发人员先前导出的菜单。导出菜单是应用程序开发人员的任务,因为有很多应用程序,所以有很多具有不同偏好的开发人员可以决定是否导出他们的菜单。

要创建具有导出菜单功能的桌面应用程序,您首先需要在该应用程序中导出一个菜单。此外,菜单必须是通用菜单,因为导出操作要求菜单结构可以序列化(转换为可以以标准方式描述菜单结构的“文本”)。一般来说,导出现有菜单的所有任务都是该特定应用程序(例如 Firefox)开发人员的任务。因此,应用程序的开发人员可以决定不导出菜单、不导出菜单、不遵循菜单结构中的约定(这意味着不能序列化)、根本不导出菜单等等……

总而言之,目前很少有开发人员决定导出他们的菜单。许多人甚至决定不使用菜单,或者以无法序列化的方式制作菜单。因此,导出菜单的操作不是默认发生的,这就是问题所在。

在某些时候,ubuntu 开发人员意识到,特定应用程序开发人员通常不想为他们开发的大多数应用程序导出菜单。这是一个大问题,因为没有这个操作,就没有任何全局菜单可显示。尽管如此,在那个时候,大多数 linux 应用程序都遵循几个惯例,例如,菜单栏的概念是一个标准功能,然后可以破解应用程序并检测菜单栏的位置,然后尝试解析它并强制将其导出为全局菜单。这正是 gnome 开发人员不希望 ubuntu 开发人员实现全局菜单的原因,因为他们所做的确实是一种黑客行为。

然而,不能对所有应用程序进行相同的破解,因为应用程序内部并不真正平等。只有使用相同工具包(Gtk、Qt、Java Swing……)制作的应用程序才真正是被破解的对象。然后,ubuntu 开发人员为 Gtk2 应用程序创建了一个破解,为 Gtk3 应用程序创建了另一个,为 Qt 应用程序创建了另一个,其他外部开发人员为 Java Swing 创建了一个。但并非所有应用程序都是按照标准工具包的方式制作的,因此,一些应用程序可以决定覆盖其菜单的工作方式,在这种情况下将无法导出非标准菜单。例如,mozilla 产品不使用标准 gtk 工具包,而是修改了工具包,然后无法以相同的方式导出其菜单。

事情变得更加复杂的是,GNOME 开发人员决定不再在其应用程序中使用菜单栏,并提倡所有 Gtk 开发人员实施这一想法。这当然与全局菜单所需的方向背道而驰,因此使事情变得更加复杂,此外,现在 Gtk4 已经发布,并且目前没有针对此版本工具包的破解。此外,GNOME 开发人员决定删除 ubuntu 开发人员用来创建 gtk 破解的功能,因此现在需要另一种机制来破解 Gtk4 应用程序。

更复杂的是,所有应用程序都在不断改变其内部实现,因此今天可以运行的应用程序可能在第二天就无法运行。工具包也是如此(请记住 hack 依赖于工具包),因为工具包在不断变化。

因此,维护全局菜单需要同时维护许多应用程序和工具包的黑客攻击。我认为我不需要解释黑客攻击某事有多复杂,以及对不断变化的事物进行黑客攻击有多复杂。这就像只制造一种疫苗对几种不断变异的病毒有效。

相关内容