X11

X11 是否仍然對應用程序資源字元串有硬編碼限制?

  • May 27, 2016

xterm(1) 手冊頁指出:

由於X 庫中對資源總數的硬編碼限制(最多 400 個),當啟用寬字元支持和 luit 時,會省略 256 色的資源。如果只允許部分資源,除了不一致的行為之外,確定確切的截止是困難的,如果資源數量超過限制,X 庫往往會崩潰。調色板仍然初始化為相同的預設值,並且可以通過控制序列進行修改。

我懷疑這些資訊已經過時了。任何人都可以確認這是(或不再是)像 X.Org 1.12 (X11R7) 這樣的當代 X 實現的問題嗎?如果它仍然存在,那麼有人需要在 X11 來源中的什麼地方尋找這個限制?

你指的是xorg/lib/libXt/Resource.c

#define MAXRESOURCES  400

稍後在同一文件中使用:

} else if (num_resources >= MAXRESOURCES) {
   XtAppWarningMsg(XtWidgetToApplicationContext(widget),
   "invalidResourceCount","getResources",XtCXtToolkitError,
         "too many resources",
     (String *)NULL, (Cardinal *)NULL);
return NULL;

Xorg 開發人員不太可能改變這一點,因為很少有應用程序可以使用這麼多資源。

xterm 中 256 色的原始方案(1999 年)為每種顏色分配了單獨的資源。

更新檔 #188 - 2004/5/12 - XFree86 4.4.99.6的更新日誌說:

  • 修改 256 色和 88 色的初始化,使 16 色以外的顏色通常不是 X 資源。這可以解決 Xt 中的硬編碼限制,當 256 色和 luit 都配置時會破壞 xterm(Noah Friedman 報告)。

報告提到luit,但除此之外,還有其他資源用於 UTF-8、語言環境等。有時需要進行一些調整,例如Patch #191 - 2004/6/6 - XFree86 4.4.99.7

  • 修復 ifdef 的 forOPT_COLOR_RES2以便在更新檔 #188 中引入的假資源表為空時不會被編譯。這恰好適用於 gcc(Joel Konkle-Parker 的報告)。

更新檔 #250 - 2009/10/13

  • 通過啟用 88 色模型的資源來改進更新檔 #188 的解決方法。
  • 在 xterm 手冊頁中記錄了資源 color16 到 color255 的有限可用性,如更新檔 #188 (Ubuntu #438850) 中所述。

該程序仍然可以使用 256 種顏色資源(並且沒有 UTF-8)建構,但現在很少這樣做了。

就像一個健全性檢查一樣,xterm 有這個塊(調試時打開):

TRACE(("VTInitialize wnew %p, %d / %d resources\n",
      (void *) wnew, XtNumber(xterm_resources), MAXRESOURCES));
assert(XtNumber(xterm_resources) < MAXRESOURCES);

並且跟踪日誌顯示

VTInitialize wnew 0xb98a90, 232 / 400 resource

因此沒有立即耗盡資源的風險,因為額外的 240 (256-16) 種顏色資源沒有被使用。

引用自:https://unix.stackexchange.com/questions/176065